请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

删除任意节点,如果要删除节点左右子树为空,疑问

图片描述

图片描述

假如我们删除42的节点,42的节点左子树,右子树都是空

那么它肯定走第一张图中的方法,返回的是node.right
可是node.right不是null吗,那么返回的就是null?

之前返回的不都是当前要删除的节点吗?
图片描述
如果返回的是当前要删除的节点,那么会什么root 等于这个要删除的节点?
图片描述

正在回答

1回答

这个函数的语义返回的不是待删除的节点,而是返回删除节点后,新的二分搜索树的根节点。


所以,要删除42,返回的空,是指,以42为根节点的二分搜索树,删除42以后,剩下的是一棵空树。


这棵空树,传给了他的父亲节点,也就是50的左子树,完成了删除动作:

https://img1.sycdn.imooc.com//szimg/5cb7ddc50001ccf104140527.jpg


之后50这个节点是把自己返回回去,而不是这个空。也就是50-42-53这棵以50为根的二分搜索树,删除掉42以后,新的二分搜索树的根节点,还是50,返回了回去。


整个过程以此类推。


其实,这个过程,和我们前面讲的链表的递归删除,是非常像的,可以在参考这个问答:https://coding.imooc.com/learn/questiondetail/70176.html,结合前面讲解的链表的递归删除过程,尤其是微观语义,理解一下整个程序是如何执行的:)


加油!:)

1 回复 有任何疑惑可以回复我~
  • 提问者 微暖丶温情 #1
    感谢老师,我又想了想,突然明白了。还是对递归掌握的不是很熟练
    回复 有任何疑惑可以回复我~ 2019-04-18 10:32:26
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信