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

来源:6-12 删除二分搜索树的任意元素

微暖丶温情

2019-04-18

图片描述

图片描述

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

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

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

写回答

1回答

liuyubobobo

2019-04-18

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


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


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

//img.mukewang.com/szimg/5cb7ddc50001ccf104140527.jpg


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


整个过程以此类推。


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


加油!:)

1
1
微暖丶温情
感谢老师,我又想了想,突然明白了。还是对递归掌握的不是很熟练
2019-04-18
共1条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程