(LeetCode 面试经典 150 题) 124. 二叉树中的最大路径和 (深度优先搜索dfs)
题目:124. 二叉树中的最大路径和
思路:深度优先搜索dfs,时间复杂度0(n)。
在当前节点root,最大的路径可能是 = 左子树符合要求的路径之和 + 右子树符合要求的路径之和。想要值最大,当然是避免累加到负数。细节看注释
C++版本:
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int mx=INT_MIN;int dfs(TreeNode* root){if(root==nullptr) return 0;// 左子树符合要求的路径之和int left=dfs(root->left);// 右子树符合要求的路径之和int right=dfs(root->right);// 当前节点root,最大的路径int sum=root->val;sum+=max(0,left);sum+=max(0,right);// 维护最大的答案mx=max(mx,sum);// 可能的最大边return max(0,max(max(left,right),0)+root->val);}int maxPathSum(TreeNode* root) {dfs(root);return mx;}
};
JAVA版本:
/*** 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 mx=Integer.MIN_VALUE;int dfs(TreeNode root){if(root==null) return 0;int left=dfs(root.left);int right=dfs(root.right);int sum=root.val;sum+=Math.max(0,left);sum+=Math.max(0,right);mx=Math.max(mx,sum);return Math.max(0,Math.max(Math.max(left,right),0)+root.val);}public int maxPathSum(TreeNode root) {dfs(root);return mx;}
}
GO版本:
/*** Definition for a binary tree node.* type TreeNode struct {* Val int* Left *TreeNode* Right *TreeNode* }*/
var mx int
func maxPathSum(root *TreeNode) int {mx=math.MinIntdfs(root)return mx
}
func dfs(root *TreeNode) int {if root==nil {return 0}left:=dfs(root.Left)right:=dfs(root.Right)sum:=root.Valsum+=max(0,left)sum+=max(0,right)mx=max(mx,sum)return max(0,root.Val+max(0,max(left,right)))
}