题目如下:
![c1d0b9b46ebd9e2f2ec3d15932266d0e.png](https://i-blog.csdnimg.cn/blog_migrate/65f6bae6d14e7f90249e68e192751df8.png)
大致意思是:给定一个非空的二叉树,返回最大路径和。路径是从树的任意结点到任意结点,路径至少包含一个结点,且不一定经过根结点。
想法其实很简单,就是递归求和。在递归函数中,如果当前结点不存在,则直接返回0,否则对其左右孩子进行递归调用。由于路径和有可能是负数,我们不希望加上负的路径和,即要么不加,要么加正数。关于全局变量最大路径max_path,对其进行更新,即max_path=left_sum+right_sum+now_data,等式右边依次是以左孩子为终点的路径和、以右孩子为终点的路径和、当前结点的数据,这样max_path就是一个完整的路径。
考虑到如果只有根结点的情况,就不调用递归函数了,直接返回根结点的数据。
代码如下。
![efe18481446a052f4e0e2478704ce085.png](https://i-blog.csdnimg.cn/blog_migrate/7355afab430108c0c422180eac81ef78.jpeg)
这是我在LeetCode上写的代码。
但是回头重新再写一遍时,有一个大胆的想法,就是完全不需要建立树的结构。
样例的输入形式是一个数组,这个数组其实是树的层序遍历结果。
如果我们按照层序对结点从1开始编号,根据二叉树的性质可以知道双亲结点和左右孩子结点之间编号的关系,而这个编号又是这个数组的下标+1。
所以在定义递归函数的时候,我把这个数组和某个结点的编号作为参数传入,因此没有定义树的结构(好吧,其实是重写的时候懒得再定义树结构)。
代码如下。
![b532ade8e33ab8d47070f911254954d3.png](https://i-blog.csdnimg.cn/blog_migrate/08176498f78a6e5601ba93b04bd5866e.png)
这里对于不存在的结点在数组中我们#代替。
结尾总结一下吧。
这是我第一次在LeetCode上做题,别问我为什么直接上手困难,是因为在别的地方看到这道题,然后想了一下,有思路后再到LeetCode上做题。
其实最开始写的是后面那个代码,我本以为在LeetCode写代码是随意写的,结果没想到给了一份模板。
这一点也不灵性啊!