删除节点存在 3 种情况,几乎所有类似博客都提到了这点。这 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