剑指 Offer II 051. 节点之和最大的路径(124. 二叉树中的最大路径和)
题目:
思路:
【1】递归的方式(深度搜索)
代码展示:
//时间1 ms击败28.91% //内存45 MB击败5.9% /** * Definition for a binary tree node. * public 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 max = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { maxPath(root); return max; } public Integer maxPath(TreeNode root){ max = Math.max(max,root.val); if (root.left == null && root.right == null) return root.val; Integer currNum = 0, leftNum = 0 , RightNum = 0; if (root.left != null) leftNum = maxPath(root.left); if (root.right != null) RightNum = maxPath(root.right); currNum = Math.max(root.val+leftNum,root.val+RightNum); currNum = Math.max(root.val,currNum); max = Math.max(max,currNum); max = Math.max(max,root.val+leftNum+RightNum); return currNum; } } //时间0 ms击败100% //内存42.9 MB击败57.89% //时间复杂度:O(N),其中 N 是二叉树中的节点个数。对每个节点访问不超过 2 次。 //空间复杂度:O(N),其中 N 是二叉树中的节点个数。空间复杂度主要取决于递归调用层数,最大层数等于二叉树的高度,最坏情况下,二叉树的高度等于二叉树中的节点个数。 class Solution { int maxSum = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { maxGain(root); return maxSum; } public int maxGain(TreeNode node) { if (node == null) { return 0; } // 递归计算左右子节点的最大贡献值 // 只有在最大贡献值大于 0 时,才会选取对应子节点 int leftGain = Math.max(maxGain(node.left), 0); int rightGain = Math.max(maxGain(node.right), 0); // 节点的最大路径和取决于该节点的值与该节点的左右子节点的最大贡献值 int priceNewpath = node.val + leftGain + rightGain; // 更新答案 maxSum = Math.max(maxSum, priceNewpath); // 返回节点的最大贡献值 return node.val + Math.max(leftGain, rightGain); } }