[LeetCode]124. 二叉树中的最大路径和(java实现)递归
·
[LeetCode]124. 二叉树中的最大路径和(java实现)递归
1. 题目




2. 读题(需要重点注意的东西)
思路(递归):
最大路径和
枚举每个节点p,经过该节点的最大路径和有如下四种情况:
-
p.val (左子树和右子树的最大路径均小于0)
-
p.val + left(右子树的最大路径小于0)
-
p.val + right (左子树的最大路径小于0)
-
p.val + right + left(左子树和右子树的最大路径均大于0)
p.val为当前节点的值,left为p的左子树的路径最大值,right为p的右子树的路径最大值
沿父节点-子节点连接:即只能从该节点向上连接,如当前节点是15,那么可能存在红色路径,也可能存在蓝色路径;

但是绝不会是这样的路径

因此,当前节点作为父节点的一个子节点和父节点连接的话则只能取!!单边!!的最大值,即只能存在要么从左孩子而来的路径,要么从右孩子而来的一条路径
-
只有当前节点
-
当前节点+左子树
-
当前节点+右子树
3. 解法
---------------------------------------------------解法---------------------------------------------------:
/**
* 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 res = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
dfs(root);
return res;
}
// dfs的作用是返回子树一边的最大路径和
private int dfs(TreeNode root){
if(root == null) return 0;
// 左孩子的最大和
int left = Math.max(0,dfs(root.left));
// 右孩子的最大和
int right = Math.max(0,dfs(root.right));
// 当前节点的最大和,!!!注意此处需要两边的最大和!!!
res = Math.max(res,root.val + left + right);
// 返回以root为根节点的单边的最大路径和
return Math.max(left,right) + root.val;
}
}
可能存在的问题:
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
更多推荐
所有评论(0)