题目描述:
题号:124
二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
解题思路:
思路一:递归
一个节点的最大路径和取决于它本身的值 + 左右子树的最大路径和
1、因此可以使用一个函数来递归计算它的左右子树的最大路径和,当路径和为负数时不计入计算。
2、同时用一个变量来保持和随时更新最大的路径和。
时间复杂度:O(N)
空间复杂度:O(N)
C++
// 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 {
int maxSum(TreeNode* root, int &answer) {
if (root == nullptr) {
return 0;
}
int left = maxSum(root->left, answer);
int right = maxSum(root->right, answer);
// 当节点递归的最大和大于 0 才会选取它
int lmr = root->val + max(0, left) + max(0, right);
int ret = root->val + max(0, max(left, right));
answer = max(answer, max(lmr, ret));
return ret;
}
public:
int maxPathSum(TreeNode* root) {
int answer = INT_MIN;
maxSum(root, answer);
return answer;
}
};
go
// go
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func maxPathSum(root *TreeNode) int {
answer := math.MinInt32
var maxSum func(*TreeNode) int
maxSum = func(node *TreeNode) int {
if node == nil {
return 0
}
// 只有子树总和大于 0 的时候才算入
leftGain := max(maxSum(node.Left), 0)
rightGain := max(maxSum(node.Right), 0)
// 节点的最大路径和取决于该节点的值与该节点的左右子树的最大路径和
priceNewPath := node.Val + leftGain + rightGain
answer = max(answer, priceNewPath)
return node.Val + max(leftGain, rightGain)
}
maxSum(root)
return answer
}
func max(a, b int) int {
if a > b {
return a
}
return b
}