leetcode 538 Convert BST to Greater Tree

leetcode 538 Convert BST to Greater Tree

  • 老师您好 这边想再跟您探讨一个leetcode 题目http://img1.sycdn.imooc.com//climg/61109e7709fbcab807140791.jpg

    这道题我的解法与您的返回ret有点不太一样,我是直接返回一个root  但是我的 解法有一个问题 就是它不能像您的一样把树左分枝的数一起加进去一起返回只能返回右子树所有数字的和想请问如果要通过这个需要怎么改

  • http://img1.sycdn.imooc.com//climg/61109e9e09fb4d8607430398.jpg

其次 看了您的解法您返回了一个ret 但是这个ret 您好像只是返回了这个ret貌似没有对root的val产生影响您能稍微解释下这样做的原因吗


http://img1.sycdn.imooc.com//climg/61109fe5092bf13c09750917.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
liuyubobobo 2021-08-09 18:54:48

node->val += lsum + t 就会修改正在遍历的 node 的 val 值。


因为每个节点要添加上比他大的所有 key 的值,而一部分比他大的所有的 key 的值都在他的右子树上,所以我们在 dfs 的过程中直接统计所有子树的元素和就是很自然的了。我的 dfs 的返回值就是以 root 为根的子树的元素和。


(P.S. 我的代码的 lsum 和 rsum 竟然写反了,让我琢磨了好半天... = =)


==========


你想返回结果的根是可以的,但因为在遍历的时候我们也需要每个子树的元素和,相当于遍历的过程中,我们需要两个返回结果,我们只需要把这两个返回结果打一个包返回就好。在 C++ 中可以是用 pair,在 Java 中可以自己创建一个新的类承载多个元素。更一般的,如果我们在 dfs 的过程中需要得到子树的多个结果,把多个结果一起打一个包返回就好。(对于这一点,直接支持多返回值的语言就会显得更方便,比如 Python)


这里是我的参考代码:https://github.com/liuyubobobo/Play-Leetcode/blob/master/0501-1000/0538-Convert-BST-to-Greater-Tree/cpp-0538/main2.cpp


但其实,对于这个问题,由于遍历的过程中根本没有改变树的结果,只是改变树的节点的值,返回节点是没必要的(返回的节点肯定是传来的 node)


==========


另外,对于这个问题,其实我们还可以使用一个全局变量(在类中就是积累的成员变量)来记录当前遍历的所有节点的和。我们在 dfs 的时候可以每次先遍历右子树,再遍历左子树,也就是先找元素从大到小遍历。这样每次到一个 node 的时候,中序的位置,sum 中就是比当前 node 更大的所有元素的和。


我的参考代码:https://github.com/liuyubobobo/Play-Leetcode/blob/master/0501-1000/0538-Convert-BST-to-Greater-Tree/cpp-0538/main3.cpp


不过其实我不是特别喜欢设立这种算法相关的全局变量,所以看你的个人喜好了。(这种方式本身在很多编程实践中也不推荐使用,比如函数式编程。)


继续加油!:)


问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
算法与数据结构
  • 参与学习       2583    人
  • 解答问题       1082    个

慕课网算法名师Liuyubobobo,5年集大成之作 从0到工作5年,算法与数据结构系统解决方案

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师