基本结构
二叉搜索树(Binary Search Tree),它是一颗具有下列性质的二叉树:
- 若左子树不空,则左子树上所有结点的值均小于或等于它的根结点的值;
- 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
- 左、右子树也分别为二叉搜索树。
- 等于的情况只能出现在左子树或右子树中的某一侧。
由于二叉查找树的中序遍历是从小到大的,故又名二叉排序树(Binary Sort Tree)。
插入节点
将某节点(insert_node),插入至以node为根二叉查找树中:
- 如果insert_node节点值小于当前node节点值:
- 如果node有左子树,则递归的将该节点插入至左子树为根二叉排序树中。
- 否则,将node->left赋值为该节点地址
- 否则(大于等于情况):
- 如果node有右子树,则递归的将该节点插入至右子树为根二叉排序树中
- 否则,将node->right赋值为该节点地址
//中序遍历
void middleOrder(TreeNode* node) {
if (!node)
return;
middleOrder(node->left);
cout << node->val << endl;
middleOrder(node->right);
}
//插入节点
void BST_insert(TreeNode* node, TreeNode* insert_node) {
//判断左子树
if (insert_node->val < node->val) {
if(node->left) //左子树存在
BST_insert(node->left, insert_node);
else //左子树为空时
node->left = insert_node;
}
//判断右子树
else {
if (node->right) //右子树存在
BST_insert(node->right, insert_node);
else //右子树为空时
node->right = insert_node;
}
}
void test02()
{
TreeNode root(8); //以8为跟
vector<TreeNode*> node_vec;
int test[] = { 3, 10, 1, 6, 25 };
for (int i = 0; i < 5; i++)
node_vec.push_back(new TreeNode(test[i]));
for (int i = 0; i < node_vec.size(); i++)
BST_insert(&root, node_vec[i]);
middleOrder(&root);
}
查找数值
查找数值value是否在二叉查找树中出现:
- 如果 value等于当前查看node的节点值:返回真。
- 如果value节点值小于当前node节点值:
- 如果当前节点有左子树,继续在左子树中查找该值;否则,返回假。
- 否则(value节点值大于当前node节点值):
- 如果当前节点有右子树,继续在右子树中查找该值;否则,返回假。
//查找结点
bool BST_search(TreeNode* node, int val) {
if (node->val == val)
return true;
//寻找左子树
if (val < node->val) {
if (node->left)
BST_search(node->left, val);
else
return false;
}
//寻找右子树
else {
if (node->right)
BST_search(node->right, val);
else
return false;
}
}