二叉排序树的 添加 删除

1、添加

每次新添加的节点都是整个树的子叶节点。

2、删除

除节点要从查找要删的节点开始入手,首先找到节点,这个要删除的节点可能有三种情况需要考虑:

         ·该节点是叶节点,没有子节点

         ·该节点有一个子节点

         ·该节点有两个子节点

         第一种最简单,第二种也还是比较简单的,第三种就相当复杂了。下面分析这三种删除情况:

第一种:要删除叶节点,只需要改变该节点的父节点对应子字段的值即可,由指向该节点改为null就可以了。

第二种:当节点有一个子节点时,这个节点只有两个连接:连向父节点和连向它唯一的子节点。需要从这个序列中剪断这个节点,把它的子节点直接连到它的父节点上即可,这个过程要求改变父节点适当的引用(左子节点还是右子节点),指向要删除节点的子节点即可

第三种:情况最复杂,如果要删除有两个子节点的节点,就不能只用它的一个子节点代替它。


对于第三种,我们需要找到删除节点的后继节点。  那么如何找后继节点呢?

首先得找到要删除的节点右子节点,它的关键字值一定比待删除节点的大。然后转到待删除节点右子节点左子节点那里(如果有的话),然后到这个左子节点左子节点,再找左子节点左子节点.........以此类推,顺着左子节点的路径一直向下找,这个路径上的最后一个左子节点就是待删除节点的后继。如果待删除节点的右子节点没有左子节点,那么这个右子节点本身就是后继

找到了后继节点,现在开始删除了,先看第一种情况,后继节点是delNode(要删除的节点)右子节点的左子节点.....(可能的后代)做后代,这种情况要执行以下四个步骤:

         ·把后继节点的父节点的leftChild字段置为后继节点的右子节点;

         ·把后继的rightChild字段置为要删除节点的右子节点;

         ·把待删除节点从它父节点的leftChild或rightChild字段删除,把这个字段(待删除节点的父节点的leftChild或者rightChild这一个字段)置为后继节点(即用选中的后继节点替换下要删除的那个节点);

         ·把待删除的左子节点移除,将后继节点的leftChild字段置为待删除节点的左子节点。


 如果后继节点就是待删除节点的右子节点,这种情况就简单了,因为只需要把后继为跟的子树移到删除的节点的位置即可。



转载算法:https://blog.csdn.net/eson_15/article/details/51138663

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值