LeetCode.H124.二叉树中的最大路径和
题目:
题目大意:
求树中的最大路径。
数据范围:
如图所示
思路:
思路与LeetCode.M687.最长同值路径大致一致,都是递归的处理一个节点 node 的左右孩子节点。
对于一个节点 node1,我们可知以 node1 为根的树的最大路径,可能是由以下几种情况组成:
-
- 以 node1 为出发点,向 node1.left 延伸出的路径。
-
- 以 node1 为出发点,向 node1.right 延伸的路径。
-
- node1 在中间,向 node1.left 和 node1.right 延伸的路径。
-
- 最大路径在以 node1.left 或 node1.right 为根节点的树中。
这样的话,我们可以递归的处理每一个节点,求情况1.2.3.的最大值来更新 ans,以全局变量 ans 记录最大路径的值。
现在思考以节点 node1 延伸出去的左右孩子节点的路径值(包括 node1 ),也就是函数的返回值怎么计算。节点 node1 向其左孩子 node2 延伸出的路径 为 l ,向其右孩子 node3 延伸出的路径为 r,则可能有以下几种情况组成:
-
- 只有 node1 节点。
-
- 有 node1 节点和 node2 节点(的路径值)。
-
- 有 node1 节点和 node3 节点(的路径值)。
我们取这三种情况的最大值则为 node1 节点的路径值,并返回作为 node1 的父节点的 l (或r)使用。
代码:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
class Solution {
int ans = -(int)1e9;
public int getAns(TreeNode root){
if (root == null)
return 0;
int l = getAns(root.left), r = getAns(root.right);
int t = Math.max(l, r) + root.val;
t = Math.max(t ,root.val);
t = Math.max(t, root.val + l + r);
ans = Math.max(ans, t);
int temp = Math.max(root.val, root.val + l);
temp = Math.max(temp, root.val + r);
return temp;
}
public int maxPathSum(TreeNode root) {
getAns(root);
return ans;
}
}
public class Main {
public static void main(String[] args) {
}
}
时空复杂度分析等:
-
时间复杂度 : O(n)
-
空间复杂度 : O(n)