二叉查找树(Binary Search Tree)--结点的删除操作(导入自原博客)
2011-07-27 22:03
246 查看
在二叉查找树的操作中,结点的删除是相对复杂的~
设要删除的结点为X,主要分三种情况~
1.X为叶子结点,也就是X没有左右孩子,这种情况直接删掉X即可~
2.X只有一个孩子,左孩子或右孩子,这种情况下将X的双亲结点原来指向X的指针指向X的孩子,而后删除X即可~
3.X有左右两个孩子。这是值得注意,也是最复杂的情况。可以首先对二叉查找树进行中序遍历,这种遍历保持了结点大小的相对顺序。找到X的后继元素(前驱也可),设为X_SUCC,使得X_SUCC代替X的位置,从而X的左子树即为X_SUCC的左子树,X的右子树即为X_SUCC的右子树;之后将原来X_SUCC结点的双亲结点指向X_SUCC的指针指向X_SUCC的右孩子(如果是找前驱替代,即指向左孩子);最后把X删掉就OK了~~~~
算法也从这三种情况考虑~
void DeleteBinarySearchTree(BiTree&X){
//从二叉查找树总删除结点X
if (!X->lchild &&!X->rchild){ //X为叶子结点
free(X);
}
else if(!X->lchild){ //X只有右孩子
q=X; X=X->rchild; free(q);
}
else if(!X->rchild){ //X只有左孩子
q=X;X=X->lchild; free(q);
}
else { //X有左右两个孩子
q=X;
s=X->rchild; //寻找X的后继
while(s->lchild){
q=s;s=s->lchild; //最终,s为X的前驱;q为s的双亲结点
}
X->data=s->data; //s替代了X结点
if(q != X){
q->lchild=s->rchild;
}
else{
q->rchild=s->rchild;//q如果就是X,那么s的右孩子变为q的右孩子
}
free(s);
}
}
设要删除的结点为X,主要分三种情况~
1.X为叶子结点,也就是X没有左右孩子,这种情况直接删掉X即可~
2.X只有一个孩子,左孩子或右孩子,这种情况下将X的双亲结点原来指向X的指针指向X的孩子,而后删除X即可~
3.X有左右两个孩子。这是值得注意,也是最复杂的情况。可以首先对二叉查找树进行中序遍历,这种遍历保持了结点大小的相对顺序。找到X的后继元素(前驱也可),设为X_SUCC,使得X_SUCC代替X的位置,从而X的左子树即为X_SUCC的左子树,X的右子树即为X_SUCC的右子树;之后将原来X_SUCC结点的双亲结点指向X_SUCC的指针指向X_SUCC的右孩子(如果是找前驱替代,即指向左孩子);最后把X删掉就OK了~~~~
算法也从这三种情况考虑~
void DeleteBinarySearchTree(BiTree&X){
//从二叉查找树总删除结点X
if (!X->lchild &&!X->rchild){ //X为叶子结点
free(X);
}
else if(!X->lchild){ //X只有右孩子
q=X; X=X->rchild; free(q);
}
else if(!X->rchild){ //X只有左孩子
q=X;X=X->lchild; free(q);
}
else { //X有左右两个孩子
q=X;
s=X->rchild; //寻找X的后继
while(s->lchild){
q=s;s=s->lchild; //最终,s为X的前驱;q为s的双亲结点
}
X->data=s->data; //s替代了X结点
if(q != X){
q->lchild=s->rchild;
}
else{
q->rchild=s->rchild;//q如果就是X,那么s的右孩子变为q的右孩子
}
free(s);
}
}
相关文章推荐
- 二叉查找树/删除结点操作
- 问题六十四:怎么用C++实现二叉查找树(binary search tree)及其相关操作
- 二叉查找树的各项操作(重点是结点的删除部分和递归的运用)
- Javascript数据结构之禅:二叉查找树(Binary Search Tree)
- Elasticsearch的数据导出和导入操作(elasticdump工具),以及删除指定type的数据(delete-by-query插件)
- 程序员面试宝典_链表基本操作,建立,求长,删除和插入特定值的结点
- 删除结点的操作(单链表)
- 平衡二叉树(AVL)结点删除操作
- 二叉查找树(二叉排序树)创建,插入,删除操作。
- Solr(二)使用solrJ对solr进行导入、查询、删除操作
- 《Algorithms》——删除二叉查找树中的结点
- 二叉查找树删除操作
- 动态查找---->二叉查找树(Binary Search Tree)
- 二叉查找树的创建及删除节点操作
- 剑指offer算法题之单链表的删除结点操作--面试题13:在O(1)时间删除链表结点
- 二叉搜索树的查询、插入与删除操作(Binary Search Tree, Search, Insert, Delete)(C++)
- 二叉查找树的查找、插入、删除、释放等基本操作的实现(C语言)
- 二叉查找树(Binary Search Tree)
- 循环结点的前驱删除操作
- Oracle 数据库操作 导入导出 删除用户 表空间