1、添加
每次新添加的节点都是整个树的子叶节点。
2、删除
除节点要从查找要删的节点开始入手,首先找到节点,这个要删除的节点可能有三种情况需要考虑:
·该节点是叶节点,没有子节点
·该节点有一个子节点
·该节点有两个子节点
第一种最简单,第二种也还是比较简单的,第三种就相当复杂了。下面分析这三种删除情况:
第一种:要删除叶节点,只需要改变该节点的父节点对应子字段的值即可,由指向该节点改为null就可以了。
第二种:当节点有一个子节点时,这个节点只有两个连接:连向父节点和连向它唯一的子节点。需要从这个序列中剪断这个节点,把它的子节点直接连到它的父节点上即可,这个过程要求改变父节点适当的引用(左子节点还是右子节点),指向要删除节点的子节点即可
第三种:情况最复杂,如果要删除有两个子节点的节点,就不能只用它的一个子节点代替它。
对于第三种,我们需要找到删除节点的后继节点。 那么如何找后继节点呢?
首先得找到要删除的节点的右子节点,它的关键字值一定比待删除节点的大。然后转到待删除节点右子节点的左子节点那里(如果有的话),然后到这个左子节点的左子节点,再找左子节点的左子节点.........以此类推,顺着左子节点的路径一直向下找,这个路径上的最后一个左子节点就是待删除节点的后继。如果待删除节点的右子节点没有左子节点,那么这个右子节点本身就是后继。
找到了后继节点,现在开始删除了,先看第一种情况,后继节点是delNode(要删除的节点)的右子节点的左子节点.....(可能的后代)做后代,这种情况要执行以下四个步骤:
·把后继节点的父节点的leftChild字段置为后继节点的右子节点;
·把后继的rightChild字段置为要删除节点的右子节点;
·把待删除节点从它父节点的leftChild或rightChild字段删除,把这个字段(待删除节点的父节点的leftChild或者rightChild这一个字段)置为后继节点(即用选中的后继节点替换下要删除的那个节点);
·把待删除的左子节点移除,将后继节点的leftChild字段置为待删除节点的左子节点。
如果后继节点就是待删除节点的右子节点,这种情况就简单了,因为只需要把后继为跟的子树移到删除的节点的位置即可。
转载算法:https://blog.csdn.net/eson_15/article/details/51138663