每天开心一点

数据结构-树(四)

2020-10-24 15:44:00    六月    1056    转贴

删除节点存在 3 种情况,几乎所有类似博客都提到了这点。这 3 种情况分别如下:

  1. 没有左右子节点,可以直接删除

  2. 存在左节点或者右节点,删除后需要对子节点移动

  3. 同时存在左右子节点,不能简单的删除,但是可以通过和 后继节点交换后转换为前两种情况

思路:

先获取待删除节点 item 的父节点(以下简称 item)。    

如果父节点不为空,判断 item 的左右子树是否存在:   

如果左右子树都为空时,是叶子节点直接删除;如:20,32,40,75,100节点      

当左子树为空时,进一步判断 item 是父节点的左孩子,还是右孩子;            

如果是左孩子,将父节点的左指针指向 item 的右子树,反之将父节点的右指针指向 item 的右子树。 如:70节点       

当右子树为空时,进一步判断 item 是父节点的左孩子,还是右孩子;            

如果是左孩子,将父节点的左指针指向 item 的左子树,反之将父节点的右指针指向 item 的左子树。如:34节点         

当左右子树均不为空时, 寻找右子树中的最左叶子节点 x将 x 替代要删除的节点。 如:50,30,35, 80节点

替换节点就是从被删除的节点出发经过它的右节点。然后右结点最左边的叶子节点就是我们要找的,它有一个专业名词叫 中序后继节点

删除成功,返回 True。    

删除失败, 返回 False。  

参考: https://blog.csdn.net/isea533/article/details/80345507

https://www.cnblogs.com/xfgnongmin/p/10860492.html

https://blog.csdn.net/zxnsirius/article/details/52131433