题目描述
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和是路径中各节点值的总和。
给你一个二叉树的根节点 root ,返回其最大路径和 。
涉及tag
二叉树
算法思路
本题要求找到各节点总值并返回最大值,类似数组的返回最大之总数和,也是需要将当前节点的value和0进行比较,如果大于0 加入路径,否则加入路径没有意义。
采用递归+分治法,仅仅考虑包含当前root节点的单边最大分支的值是否会被父节点采用:只有大于0才会被采用。
示例代码
/**
* 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) {
if (root == null) {
return 0;
}
dfs(root);
return max;
}
/**
* 返回经过root的单边分支最大和, 即Math.max(root, root+left, root+right)
* @param root
* @return
*/
public int dfs(TreeNode root) {
if (root == null) {
return 0;
}
//计算左边分支最大值,左边分支如果为负数还不如不选择
int leftMax = Math.max(0, dfs(root.left));
//计算右边分支最大值,右边分支如果为负数还不如不选择
int rightMax = Math.max(0, dfs(root.right));
//left->root->right 作为路径与已经计算过历史最大值做比较
max = Math.max(max, root.val + leftMax + rightMax);
// 返回经过root的单边最大分支给当前root的父节点计算使用
return root.val + Math.max(leftMax, rightMax);
}
}
时间复杂度:O(N), N 是二叉树中的节点个数。
空间复杂度:O(N),空间复杂度主要取决于递归调用层数,最大层数等于二叉树的高度,最坏情况下,二叉树是单节点的树,它的的高度等于二叉树中的节点个数。