什么是二叉排序树?
二叉排序树要么是空树,要么具有以下的特性:
【算法】二叉排序树中查找值
递归遍历二叉树
递归结束条件:
若key值小于结点值,进入左孩子查找。否则进入右孩子查找
BiTree SearchBST(BiTree root, int key) {
//如果root为NULL,说明树中并无该结点,返回NULL;若结点值等于key,返回结点
if(!root || root->val == key)
return root;
else if(key < root->val)
return SearchBST(root->left, key);
else if(key > root->val)
return SearchBST(root->right, key);
}
【算法】二叉排序树中插入数值
二叉排序树是动态查找表的一种形式,有时会在搜索过程中删除或删除表中元素。该元素的插入位置一定位于二叉排序树的叶子结点,并且一定是查找失败时访问的最后一个叶子结点的左或右孩子
/*
*root:被搜索的当前结点
*lastNode:上一个结点,当root为NULL(表明未找到key值时,为该插入位置的双亲结点)
*BiTree* p:用来返回该操作结点
*/
bool SearchBST(BiTree root, int key, BiTree lastNode, BiTree *p) {
//若root结点不存在,代表二叉排序树中没有key值,将lastNode结点赋给p,方便之后的插入操作
if(!root) {
*p = lastNode;
return 0;
}
//如果相等,让p指向该结点
if(root->val == key) {
*p = root;
return 1;
}
else if(key < root->val) {
return SearchBST(root->left, key, root, p);
}
else if(key > root->val) {
return SearchBST(root->right, key, root, p);
}
}
bool InsertBST(BiTree root, int key) {
BiTree* p = NULl;
//若未找到结点,在二叉排序树中添加结点
if(!SearchBST(root, key, NULL, p)) {
BiTree* node = (BiTree*)malloc(sizeof(BiTree));
node->val = key;
node->lchild = NULL;
node->rchild = NULL;
//如果p为NULL,证明二叉排序树为空
if(!p) {
root = node;
}
//此时p为该被操作的双亲结点
if(key < p->val)
p->lchild = node;
else if(key > p->val)
p->rchild = node;
return true;
}
//若查找成功,则不需要做任何操作
return false;
}
