二叉排序树的删除

yanglilibaobao 2007-04-18 10:41:36
二叉排序树的删除:
对于一般的二叉树来说,删去树中的一个结点是没有意义的,因为它将使以被删除的结点为根的子树变成森林,破坏了整棵树的结构
但是,对于二叉排序树,删去树上的一个结点相当于删去有序序列中的一个记录,只要在删除某个结点后不改变二叉排序树的特性即可。
在二叉排序树上删除一个结点的算法如下:
btree * DeleteBST(btree *b, ElemType x)
{
if (b)
{
if (b->data == x)
b = DelNode(b);
else if (b->data > x)
b->lchild = DeleteBST(b->lchild, x);
else
b->rchild = DeleteBST(b->rchild, x);
}
return b;
}

   其中删除过程有两种方法。
第一种过程如下:
1。若p有左子树,找到其左子树的最右边的叶子结点r,用该叶子结点r来替代p,把r的左孩子
作为r的父亲的右孩子。
2。若p没有左子树,直接用p的右孩子取代它。

第二种过程如下:
1。若p有左子树,用p的左孩子取代它;找到其左子树的最右边的叶子结点r,把p的右子树作为r
的右子树。
2。若p没有左子树,直接用p的右孩子取代它。
两种方法各有优劣,第一种操作简单一点点,但均衡性不如第二种,因为它将结点p的右子树
全部移到左边来了。下面将分别以两种种思路编写代码。


第一种:
btree * DelNode(btree *p)
{
if (p->lchild)
{
btree *r = p->lchild; //r指向其左子树;
while(r->rchild != NULL)//搜索左子树的最右边的叶子结点r
{
r = r->rchild;
}
r->rchild = p->rchild;

btree *q = p->lchild; //q指向其左子树;
free(p);
return q;
}
else
{
btree *q = p->rchild; //q指向其右子树;
free(p);
return q;
}
}

第二种:
btree * DelNode(btree *p)
{
if (p->lchild)
{
btree *r = p->lchild; //r指向其左子树;
btree *prer = p->lchild; //prer指向其左子树;
while(r->rchild != NULL)//搜索左子树的最右边的叶子结点r
{
prer = r;
r = r->rchild;
}

if(prer != r)//若r不是p的左孩子,把r的左孩子作为r的父亲的右孩子
{
prer->rchild = r->lchild;
r->lchild = p->lchild; //被删结点p的左子树作为r的左子树
}
r->rchild = p->rchild; //被删结点p的右子树作为r的右子树

free(p);
return r;
}
else
{
btree *q = p->rchild; //q指向其右子树;
free(p);
return q;
}
}
但是上面这种方法,把r移来移去,很容易出错,其实在这里我们删除的只是p的元素值,而不是它的地址,所以完全没有必要移动指针。仔细观察,发现我们删除的地址实际上是p的左子树的最右边的叶子结点r的地址,所以我们只要把r的数据填到p中,然后把r删除即可。
算法如下:
btree * DelNode(btree *p)
{
if (p->lchild)
{
btree *r = p->lchild; //r指向其左子树;
btree *prer = p->lchild; //prer指向其左子树;
while(r->rchild != NULL)//搜索左子树的最右边的叶子结点r
{
prer = r;
r = r->rchild;
}
p->data = r->data;

if(prer != r)//若r不是p的左孩子,把r的左孩子作为r的父亲的右孩子
prer->rchild = r->lchild;
else
p->lchild = r->lchild; //否则结点p的左子树指向r的左子树

free(r);
return p;
}
else
{
btree *q = p->rchild; //q指向其右子树;
free(p);
return q;
}
}


转http://www.programfan.com/
...全文
2112 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
greaper615 2012-10-15
  • 打赏
  • 举报
回复
嗯学习了。原来只要直接交换值就可以了,这都没想到,我真是笨死了……
qirutr 2012-10-12
  • 打赏
  • 举报
回复
学习,学习的,顶顶!!!!
牙牙学语 2012-10-10
  • 打赏
  • 举报
回复
mark
xingpeiyue 2012-10-09
  • 打赏
  • 举报
回复
喜欢,很想学
magic_an001 2012-10-08
  • 打赏
  • 举报
回复
mark,学习
花花花湖 2012-10-08
  • 打赏
  • 举报
回复
学习了。不过,数据结构上的那个方法挺好的。
卡卡_苏米 2011-11-23
  • 打赏
  • 举报
回复
很好,高手~·
yinpan1990 2011-11-22
  • 打赏
  • 举报
回复
石油大学数据结构视频高清教程下载,这个是我认为讲得最好的数据结构视频,严蔚敏的我看过,感觉有点死气沉沉!
1. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f01.csf
2. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f02.csf
3. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f03.csf
4. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f04.csf
5. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f05.csf
6. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f06.csf
7. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f07.csf
8. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f08.csf
9. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f08.csf
10. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f10.csf
11. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f11.csf
12. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f12.csf
13. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f13.csf
14. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f14.csf
15. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f15.csf
16. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f16.csf
17. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f17%b4%ae.csf
18. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f18.csf
19. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f19.csf
20. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f20.csf
21. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f21.csf
22. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f22.csf
23. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f23.csf
24. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f24.csf
25. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f25.csf
26. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f26.csf
27. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f27.csf
28. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f28.csf
29. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f29.csf
30. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f30.csf
31. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f31.csf
32. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f32.csf
33. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f33.csf
34. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f34.csf
35. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f35.csf
36. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f36.csf
37. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f37.csf
38. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f38.csf
39. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f39.csf
40. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f40.csf
41. http://n.qjwm.com/down.aspx?down=ok&filepath=forwk1990%2f%ca%af%d3%cd%b4%f3%d1%a7%ca%fd%be%dd%bd%e1%b9%b9%b8%df%c7%e5%cf%c2%d4%d8%2f41.csf

bomiaomiao123 2011-11-19
  • 打赏
  • 举报
回复
mark
小步舞曲 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 zfzf294990051 的回复:]
typedef int Status;
Status Delete(BiTree &T)
{
if(!p->rchild)//右子树空,只需重接左子树
{
q=p;p=p->lchild;free(q);
}
else if(!p->lchild)//左子树空,只需接右子树
q=p;p=p->rchild;free(q);
else//左右子树均不空
{
q=p;
……
[/Quote]

q=p;p=p->lchild;free(q);
为什么只需重新接子数? 如果这样那p的父节点的lChild或者rChild的值会变成什么??
这样不是也变成森林了嘛??
INGDI 2010-05-24
  • 打赏
  • 举报
回复
mark
顶27楼
fairywell 2010-05-22
  • 打赏
  • 举报
回复
恩,写的不错,可以参考下。
目前数据结构里常用的方法应该是,对待删除节点有两个孩子的情况,用该节点的右子树的最小元素取代这个节点,然后删除这个右子树里的最小元素即可。
pseudocode如下:

if (T->Left && T-Right) /* two children */
{
TmpCell = FindMin(T->Right);
T->Element = TmpCell->Element;
T->Right = Delete(T->Element, T->Right);
}


STL 源代码里面我记得也是用的这个方法
hellodota121 2010-05-22
  • 打赏
  • 举报
回复
这个东西肯定要MARK
为了以后的提升
azsx18726 2010-05-22
  • 打赏
  • 举报
回复
学习!
Sunday 2010-05-19
  • 打赏
  • 举报
回复
yaoweijq 2010-03-19
  • 打赏
  • 举报
回复
java版的一种方案,另一种没写代码实现过。。。

/**
* 1。若p有左子树,用p的左孩子取代它;
* 找到其左子树的最右边的叶子结点r,
* 把p的右子树作为r的右子树。
* 2。若p没有左子树,直接用p的右孩子取代它。
* @param key
*/
public void deleteValue(T key){
if(key == null){
return;
}
BinTreeNode<T>node = new BinTreeNode<T>(key);
if(this.getRootNode() == null || this.getRootNode().getValue() == null){
return;
}
BinTreeNode<T>parentNode = this.getRootNode();
BinTreeNode<T>tempNode = this.getRootNode();
while(true){
if(tempNode.compareTo(node) == 0){
//找到要删除的结点了
//case 1 tempNode有左子树
if(tempNode.getLeftNode()!=null){
BinTreeNode<T>leftNode = tempNode.getLeftNode();
BinTreeNode<T>rightNode = tempNode.getRightNode();
BinTreeNode<T>subLeftNode = leftNode.getLeftNode();
BinTreeNode<T>subRightNode = leftNode.getRightNode();
tempNode.setValue(leftNode.getValue());
leftNode.setLeftNode(null);
leftNode.setRightNode(null);
leftNode = null;
tempNode.setLeftNode(subLeftNode);
tempNode.setRightNode(subRightNode);
while(tempNode.getRightNode()!=null){
tempNode = tempNode.getRightNode();
}
tempNode.setRightNode(rightNode);
}
//case 2 tempNode无左子树
else{
if(tempNode.getRightNode()==null){
if(parentNode.compareTo(this.getRootNode())==0){
this.rootNode = null;
return;
}
if(parentNode.getLeftNode()!=null&&parentNode.getLeftNode().compareTo(tempNode)==0){
parentNode.setLeftNode(null);
}else{
parentNode.setRightNode(null);
}
tempNode = null;
}else{
BinTreeNode<T>leftNode = tempNode.getRightNode().getLeftNode();
BinTreeNode<T>rightNode = tempNode.getRightNode().getRightNode();
BinTreeNode<T>tempRightNode = tempNode.getRightNode();
tempNode.setLeftNode(leftNode);
tempNode.setRightNode(rightNode);
tempNode.setValue(tempRightNode.getValue());
tempRightNode.setLeftNode(null);
tempRightNode.setRightNode(null);
tempRightNode = null;
}
}
//删除end
return;
}else if(tempNode.compareTo(node)>0){
if(tempNode.getLeftNode()==null){
return;
}else{
parentNode = tempNode;
tempNode = tempNode.getLeftNode();
}
}else{
if(tempNode.getRightNode()==null){
return;
}else{
parentNode = tempNode;
tempNode = tempNode.getRightNode();
}
}
}
}
sxq310 2010-03-19
  • 打赏
  • 举报
回复
luguo
KID_coder 2010-03-18
  • 打赏
  • 举报
回复
mark~
LeonTown 2010-03-16
  • 打赏
  • 举报
回复
我也mark
Crazy_Java_GT 2010-03-15
  • 打赏
  • 举报
回复
mark
加载更多回复(17)

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧