二叉查找树(二叉排序树)
//查找成功,返回true,否则p指向查找路径上最后访问的节点并返回false
Status searchBST(BiTree T, KeyType key, BiTree &p) {
//树空
if(!T) {p = NULL; return false;}
else if(EQ(key, T -> data.key))
//在左子树中继续查找
return searchBSRT(T -> lchild, key ,p);
else if(LT(key, t -> data.key))
//在右子树中查找
return searchBSRT(T -> rchild, key ,p);
}
Status insertBST(BiTree T, Element e){
//当二叉树中不存在e.key时,插入e并返回true
if(!searchBST(T, e.key, p)){
s = (BiTree)malloc(sizeof(BiTree));
s -> data = e;
s -> lchild = s -> rchild = NULL;
//树空
if(!p) T = s;
else if(LT(e.key, p -> data.key))
//被插节点为*s左孩子
p -> lchild = s;
else
p -> rchild = s;
return TRUE;
}
return FALSE;
}
二叉查找树删除节点T的一般策略是:用其左子树的最大节点S的数据代替T节点的数据,并递归的删除该最大节点S。
Status deleteBST(BiTree &T, KeyType key){
//空树
if(!T) return false;
else {
//找到该元素,将其删除
if(EQ(key, T -> data.kay)) return delete(T);
else
//递归的左子树中查找
if(LT(key, t -> data.key)) return deleteBST(T -> lchild, key);
else
//递归的左子树中查找
return deleteBST(T -> rchild, key);
}
}
//删除节点p,并重接其左右子树
Status delete(BiTree &P){
//右子树为空,只需重接其左子树即可
if(!p -> rchild){
q = p;
p = p -> lchild;
free(q);
} else if(!p => lchild){
//左子树为空,只需重接其右子树即可
q = p;
p = p -> rchild;
free(p);
} else {
左右子树均不空,找到T的左子树的最大节点S
q = p;
//转到p的左子树根节点
s = p -> lchild;
//向右,走到尽头,q始终为S的直接前驱
while(s -> rchild){
q = s;
s = s -> rchild;
}
//用S代替T
p -> data = s -> data;
if(q != p)
q -> rchild = s -> lchild;
else
//p == q说明T的左子树只有一个根节点
q -> lchild = s -> lchild;
delete s;
}
return TRUE;
}
原文:https://www.cnblogs.com/haiyuexiaozu/p/11692949.html