路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给定一个二叉树的根节点 root ,返回其 最大路径和,即所有路径上节点值之和的最大值。
时间: 2024-02-09 17:10:26 浏览: 113
18923 二叉树的直径-cpp
这是一个比较经典的二叉树路径问题,常用的解法是递归。对于每个节点,我们可以计算从该节点出发的最大路径和,然后将其作为递归返回值,同时更新一个全局变量 maxSum,用于记录最大路径和。具体而言,设递归函数 maxPathSum(node) 表示从节点 node 出发的最大路径和,我们可以分为以下三种情况进行讨论:
1. node 为叶子节点:此时最大路径和即为该节点的值。
2. node 有左右子树:此时最大路径和可能有以下几种情况:
(1) 从 node.left 出发的最大路径和加上 node.val 得到的路径和最大;
(2) 从 node.right 出发的最大路径和加上 node.val 得到的路径和最大;
(3) 从 node.left 出发的最大路径和加上从 node.right 出发的最大路径和再加上 node.val 得到的路径和最大。
3. node 只有左子树或右子树:此时最大路径和可能有以下两种情况:
(1) 从 node.left 出发的最大路径和加上 node.val 得到的路径和最大;
(2) 从 node.right 出发的最大路径和加上 node.val 得到的路径和最大。
最后,我们对根节点调用 maxPathSum(root) 即可得到最大路径和。
具体实现可以参考以下代码:
```python
class Solution:
def maxPathSum(self, root: TreeNode) -> int:
self.maxSum = float('-inf') # 初始化全局变量 maxSum
self.maxPathSumHelper(root)
return self.maxSum
def maxPathSumHelper(self, node: TreeNode) -> int:
if not node: # 递归终止条件
return 0
leftSum = max(0, self.maxPathSumHelper(node.left)) # 左子树路径和
rightSum = max(0, self.maxPathSumHelper(node.right)) # 右子树路径和
self.maxSum = max(self.maxSum, leftSum + rightSum + node.val) # 更新全局变量 maxSum
return max(leftSum, rightSum) + node.val # 返回从 node 出发的最大路径和
```
对于Java版本,相应地可以做出如下修改:
```java
class Solution {
private int maxSum = Integer.MIN_VALUE; // 初始化全局变量 maxSum
public int maxPathSum(TreeNode root) {
maxPathSumHelper(root);
return maxSum;
}
public int maxPathSumHelper(TreeNode node) {
if (node == null) { // 递归终止条件
return 0;
}
int leftSum = Math.max(0, maxPathSumHelper(node.left)); // 左子树路径和
int rightSum = Math.max(0, maxPathSumHelper(node.right)); // 右子树路径和
maxSum = Math.max(maxSum, leftSum + rightSum + node.val); // 更新全局变量 maxSum
return Math.max(leftSum, rightSum) + node.val; // 返回从 node 出发的最大路径和
}
}
```
希望能够帮到你!
阅读全文