这种类型的题写得我头有点疼,总结一下以便复习。
这些题的特点是自底向上进行遍历,左右子树和根节点往往会对结果值有两种影响,一般是包括根节点和不包括根节点的情况,最后求出此树对下一次遍历的影响,直到遍历结束。
总之就是考虑两件事:
1.当前根节点对最终结果有什么影响
2.这次递归能给下次递归做出什么贡献,即给下次递归返回啥
124. 二叉树中的最大路径和
题目:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
思路:
这道题是求最大路径的节点和,所以定义一个全局变量来保存值。
1.根节点对结果的贡献:当前树的最大路径和为根节点+左子树最大路径和+右子树最大路径和(注意这里左右子树可能为负数,如果为负数则用0替代,表示不取)
2.对下次递归的贡献:因为包括根节点的最大路径只能取一条,所以选取左右子树最大路径和的最大的那支,加上根节点值返回给下次递归。
class Solution {
int res = Integer.MIN_VALUE;
public int maxPathSum(TreeNode root) {
helper(root);
return res;
}
private int helper(TreeNode root) {
if (root == null) return 0;
//求出当前根节点的左右子树的路径和
int left = Math.max(0, helper(root.left));
int right = Math.max(0, helper(root.right));
//求出当前的最大路径
res = Math.max(res, left + right + root.val);
//给下次递归做贡献
return Math.max(left, right) + root.val;
}
}
337. 打家劫舍 III
题目:
在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为“根”。 除了“根”之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果两