关于二叉搜索树增加节点的优化
来源:1-4 改进添加操作:深入理解递归终止条件
咸鱼味的猫
2022-08-19 20:31:06
画了一个图解,终于弄懂代码的前后逻辑了
本意就是将空树也作为一个node考虑进去,之前的方法是node判断左右两边(前提就已经确定了node不为空),现在是加入了node为空的考虑,
假如为空,就生成这个节点返回到上一步(node.left = add(node.left, e);或node.right = add(node.right, e);)来并入这个节点
假如不为空,首先判断,然后进入左/右子树,一直到情况1
=============
波波老师,我感觉我只能通过图解然后再去想代码才能弄清楚来龙去脉,如果跟着代码调试我就很容易晕了,有什么更好的方法吗?
1回答
liuyubobobo
2022-08-20
其实这个递归的在二分搜索树中插入过程,和递归在链表中的插入过程是完全一样的,只不过对于二分搜索树,需要判断一下左右而已。
请和链表递归插入的代码作比较:(60-67 行)https://git.imooc.com/class-105/Play-Algorithms-and-Data-Structures/src/master/08-Recursion/08-Recursive-LinkedList/src/LinkedListR.java
这个比较非常重要,请仔细理解这两个逻辑的异同。
希望你通过对这两个代码的比较:
1)对在 BST 上添加节点和在链表上添加节点的过程理解的更深刻了;
2)更重要的是,对递归的执行过程理解的更深刻了。
==========
说实话,我认为通过图解理解代码的执行原理是非常好的一种方式。关键是:最后你理解了,这很重要。如果你理解了,再看同样的或者类似的代码,你应该就不需要画图了,或者说,这个图已经在你的脑海里了。你就能跟着代码做“调试”了,那么就说明你学会了。
在我看来,你有没有学会,是对学习效果的唯一衡量标准。
一个不熟悉的逻辑,跟着调试,晕了,太正常了。简单来说,在我看来,如果编程的过程不需要“草稿纸”,说明你处理的逻辑太简单了。(但这不意味着处理这种逻辑没有价值,切记。)
或许是因为我平时接触算法方面的东西比较多,所以我的桌子上是永远有一摞草稿纸的。甚至很多时候,我主要做的事情,就是用纸笔把逻辑捋清楚。一旦把逻辑捋清楚了,真正编程其实是简单的。我认识很多算法大牛的工作其实都是如此。包括我在很多时候和别人交流的时候,核心就是拿着笔纸交流,把逻辑要做的事情“画”清楚,而不是直接对着代码一行一行看。
所以,在我看来,这是非常正常的理解逻辑的方式。我在讲课的过程中,每次在写具体的代码之前,也是通过图示的方式,让大家理解这个逻辑的执行过程是怎样的,也是这个原因。理解的多了,你对逻辑的处理越来越熟练,越来越有经验,就越来越不需要真正的把这个图“画”出来了。
在我看来,你画的图非常“精致”,甚至太过“精致”了。所以我不确定你画类似这样的图需要多少时间。如果做这样的图对你来说太花时间了,我觉得大可把图简化一些。依然是:核心是:你理解了逻辑。如果你认为需要把图做成这样,你才能深刻地理解这个逻辑,那么就没问题。否则的话,可以考虑是不是把图化简一些。画出精致的图不是目的,理解逻辑才是目的。
从我这里答疑的角度,如果需要,你在纸上画一个图,把照片贴上来,只要把问题表示清楚,就是 ok 的。
除此之外,我个人认为你在正确的学习道路上。如果你感觉哪里似乎还是有问题,下次可以把你说的“觉得晕了”那个“晕了”的地方更具体地和我交流一下。但是,如果你能通过画图,把本来“晕”的地方搞清楚,我肯定会鼓励你这么做的;同时,如果我觉得画图能更好地回答这个问题,我也会反手给你画图的。
关键在于,把“晕”的地方搞清楚,这恰恰就是“学习的过程”。
继续加油!:)
相似问题
回答 1
回答 1
回答 3
回答 1
回答 2