Leetcode刷题124. 二叉树中的最大路径和

路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。

路径和 是路径中各节点值的总和。

给你一个二叉树的根节点 root ,返回其 最大路径和 。

示例 1:

Leetcode刷题124. 二叉树中的最大路径和_第1张图片
输入:root = [1,2,3]
输出:6
解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6


示例 2:

Leetcode刷题124. 二叉树中的最大路径和_第2张图片
输入:root = [-10,9,20,null,null,15,7]
输出:42
解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
 

提示:

树中节点数目范围是 [1, 3 * 104]
-1000 <= Node.val <= 1000

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/binary-tree-maximum-path-sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

感谢vanilla111大佬的详细解法,传送门Java递归,自顶向下帮助建立递归思想

class Solution {
	int maxSum = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
		return maxPathSumI(root);
	}

	//方法一:递归,时间和空间复杂度O(N)
	//思考任一节点需要做什么,以及在什么时候做?
	//定义递归函数traverse(root)表示经过以root为根节点的二叉树的最大路径和
	//此时,这条路径有四种可能:
	//1.当前节点就是一条路径;2.左子树的路径+ 当前节点
	//3.右子树的路径 + 当前节点;4.左子树的路径+ 当前节点 + 右子树的路径
	//这几种可能都是用来计算以当前节点为根的最大路径,但是如果当前节点存在祖先节点,那第四种可能是不能作为递归返回值的
	//因为此时该子节点并不是拥有最大路径和路径的起点,所以我们用一个全局变量记录上面四种值的最大值,递归结束后,该变量就是答案。
	private int maxPathSumI(TreeNode root) {
		if (root == null) {
			return 0;
		}
		traverse(root);
		return maxSum;
	}

	private int traverse(TreeNode root) {
		if (root == null) {
			return 0;
		}
		int left = traverse(root.left);
		int right = traverse(root.right);
		//递归函数的返回值
		int res = Math.max(root.val, root.val + Math.max(left, right));
		//更新最大值
		maxSum = Math.max(maxSum, Math.max(res, root.val + left + right));
		return res;
	}
}

你可能感兴趣的:(树,二叉树,二叉搜索树,树,二叉树,DFS)