二叉查找树
二叉查找树
二叉查找树(二叉排序树)
- 对于树中每个节点X,它的左子树所有节点的值均小于X中的值,它的右子树所有节点的值均大于X中的值。左右子树也分别为二叉查找树。
二叉查找树的查找
//在T所致二叉查找树中查找关键字等于key的元素,查找成功,p指向该节点并返回true;
//否则p指向查找路径上最后访问的节点并返回false。
//f指向T的双亲,首次调用值为NULL
Status searchBST(BiTree T, KeyType key, Bitree f, BiTree &p) {
//树空
if(!T) {p = f; return false;}
else if(EQ(key, T -> data.key)){
p = T;
return TURE;
} else if(LT(key, t -> data.key))
//在左子树中继续查找
return searchBSRT(T -> lchild, key , T, p);
else
//在右子树中查找
return searchBSRT(T -> rchild, key ,T, p);
}
二叉查找树的插入
Status insertBST(BiTree T, Element e){
//当二叉树中不存在e.key时,插入e并返回true
if(!searchBST(T, e.key, NULL, 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。
- 当用S代替T,S由于是T的左子树的节点,必然小于T的右子树,符合二叉查找树特征之一
接下来就是处理左子树的顺序问题
- 由于删除的S是T的左子树的最大节点,故该节点没有右子树,S只存在或不存在左子树,
若存在左子树(删除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;
}