bobo老师,有一个小疑问一直没能解决

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

学习使我快乐丷

2018-10-18

关于successor的问题

在您的实现中,successor先设置它的右孩子,在设置它的左孩子(保持不变)。但是我在实现的时候先设置左孩子:

successor.left = node.left

然后再通过相应的操作设置右孩子,结果打印的时候就变成死循环打印了。而先设置右孩子就没有这个问题~实在是想不明白- -

写回答

1回答

liuyubobobo

2018-10-19

如果是这个逻辑:

Node successor = minimum(node.right);    
successor.left = node.left; 
successor.right = removeMin(node.right);


注意,successor.left = node.left;  相当于你在node.right的最小值左侧,又添加了新的节点(子树)。

而后面执行的removeMin的过程,就是要在node.right这棵树中不断向左寻找最小值。上面你在node.right的左侧添加了新的子树,这部分逻辑就不对了。


如果还想不明白,是用一棵非常小的树,就能复现这个问题。加个断点,然后跟进程序里,看一看程序到底发生了什么?计算机不是工科,不能光靠想,必须要实践。只有自己不断地debug,不断地实际找到自己逻辑上的漏洞,编程能力才能真正提高哦:)


加油!

1
1
学习使我快乐丷
太谢谢老师了,已经明白!以后要多多自己debug~
2018-10-19
共1条回复

玩转数据结构

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

6221 学习 · 1704 问题

查看课程