二叉查找树(Binary Search Tree)是一种特殊的二叉树,它是一种查找结构,一棵二叉查找树是一棵二叉树,且具有以下性质:
(1)若左子树不空:左子树上所有节点值均小于等于该节点的值;
(2)若右子树不空,右子树上所有节点值均大于等于该节点的值;
(3)左右子树也同样是二叉查找树(递归定义);
(4)等于的情况只能出现在二叉查找树的一侧,一般的二叉查找树无重复节点
二叉查找树的数据结构定义与普通二叉树一样:
/*二叉查找树数据结构定义*/
struct TreeNode
{
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x):val(x), left(null), right(null) {}
};
二叉查找树的节点插入
分为递归和非递归(循环)两种方式:
/*
二叉查找树的节点插入(递归)
核心:找到待插入节点的插入位置
将插入节点的val值与当前节点的val值作比较
若insert_node->val<node->val: 若左子树空,直接插入,否则在左子树中继续搜寻;
若insert_node->val>node->val: 若右子树空,直接插入,否则在右子树中继续搜寻。
*/
void BST_insert(TreeNode* node, TreeNode* insert_node) {
if (insert_node->val < node->val)
{
if (!node->left)
{
node->left = insert_node;
}
else {
BST_insert(node->left, insert_node);
}
} else {
if (!node->right)
{
node->right = insert_node;
} else {
BST_insert(node->right, insert_node);
}
}
}
/*
二叉查找树的节点插入(循环)
核心:找到待插入节点的插入位置
*/
void BST_insert(TreeNode* node, TreeNode* insert_node) {
while(node != insert_node) {
if (insert_node->val < node->val)
{
if (!node->left)
{
node->left = insert_node;
}
node = node->left;
} else {
if (!node->right)
{
node->right = insert_node;
}
node = node->right;
}
}
}
二叉查找树的节点查找
也分为归和非递归(循环)两种方式:
/*
二叉查找树的节点查找(递归)
若当前节点的val==目标value,说明找到了,return true
若当前节点的val<目标value,若当前节点无左子树,直接return false,否则查找左子树;
若当前节点的val>目标value,若当前节点无右子树,直接return false,否则查找右子树;
*/
bool BST_search (TreeNode* node, int value) {
if (node->val == value)
{
return true;
}
if (value < node->val)
{
if (!node->left)
{
return false;
} else {
return BST_search(node->left, value);
}
} else {
if (!node->right)
{
return false;
} else {
return BST_search(node->right, value);
}
}
}
/*
二叉查找树的节点查找(循环)
*/
bool BST_search (TreeNode* node, int value) {
while(node) {
if (node->val == value)
{
return true;
}
if (value < node->val)
{
node = node->left;
} else {
node = node->right;
}
}
return false;
}