老师 在二叉搜索树结点的删除这一节中, 好像忘记了考虑(删除结点)的最小后继结点可能有右结点的情况

来源:5-8 二分搜索树节点的删除(Hubbard Deletion)

杏木入口

2017-10-22

                        89

            85                91

        79    88                92

            86                         93                   

                87                    

就像删除85这个结点的时候 要将86与85结点交换 但是87是原来85的右结点

写回答

1回答

liuyubobobo

2017-10-22

在我们的代码:successor->right = removeMin(node->right); 这句话正确的处理了你说的情况哦:)


在你的例子里,node就是85所在的节点,successor就是86所在的节点。removeMin(node->right);这个函数将删除以88为根节点的二叉树中的最小节点,也就是86这个节点,并返回结果的根节点。这个过程里,removeMin将处理好87这个节点。也就是说,removeMin(node->right)这个函数将正确地返回这样的一棵树:

88
  \
  87

之后将88这个节点赋值给86的右节点。这就是在你的例子中,执行successor->right = removeMin(node->right);的完整过程。


可以尝试用你的例子,在我们的代码中真正跑一跑,调试跟踪试试看哦:)

1
0

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程