题目描述
寻找二叉树中从任意节点开始的最大不重复路径和
示例:
输入:{1,2,3}
输出:6
原题链接:NC6 二叉树中的最大路径和
思路
拿到这道题第一想法就是递归和动态规划,这没什么好说的,两者大同小异,动态规划能做,但是在树这块还是递归舒服点。
- 对于一个节点,不能重复的路径限制了该节点的最大贡献是左孩子+根节点或右孩子+根节点
- 递归每一步:计算左子树和右子树的贡献,并回溯
- 出口:节点为空
递归
这里肯定是深度遍历dfs,那么我遍历到一个节点之后要干什么呢,一是我要不要走这个节点,二是我走这个节点后走左子树还是右子树。
- 要不要走:用贡献度区分,贡献度是正的就走,贡献度非正就设为0,认为没走
- 走左子树还是右子树:回溯的时候谁贡献度大走谁
private int res=Integer.MIN_VALUE;
public int dfs(TreeNode node){
if(node == null) return 0;//出口
int left=Math.max(dfs(node.left),0);//左子树贡献度,贡献度是0的时候认为不走
int right=Math.max(dfs(node.right),0);//右子树贡献度
res=Math.max(res,left+right+node.val);//更新最大路径
return node.val+Math.max(left,right);//回溯当前节点贡献度
}