题目描述:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路:
对于一个简单二叉树
可以走左边,走右边,或者两边都不走
然后最大路径是走单边的最大和,或者走左边+走节点+走右边的最大和
代码如下:
C++:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int res=INT_MIN;
int dfs(TreeNode* root){
if(!root) return 0;
int left=max(dfs(root->left),0);
int right=max(dfs(root->right),0);
res=max(res,root->val+left+right);//更新目标值,(已有目标值,走单边最大值,走左边+走节点+走右边)三者最大值
return root->val+max(left,right);//从根节点往左走,或者往右走,或者两边都不走
}
int maxPathSum(TreeNode* root) {
if(!root) return 0;
dfs(root);
return res;
}
};
Python:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.ans=float("-inf")
def dfs(node:TreeNode):
if node is None: return 0
left=dfs(node.left)
right=dfs(node.right)
max_path=max(left+node.val,right+node.val,node.val)
self.ans=max(self.ans,left+right+node.val,max_path)
return max_path
dfs(root)
return self.ans