二叉树中的最大路径和(LeetCode 124 -- 使用递归)

题目

给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]

   1
  / \
 2   3

输出: 6 示例 2:
输入: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

输出: 42

解析

想到left的最大路径和right的最大路径求完之后更新最终结果的状态。思考递归子问题的代码的构造。会发现两个关键问题:

1.递归需要记录下来左右子树经过根节点的最大值,以便计算后面的父节点,对应代码即:

return Math.Max(leftSum, rightSum) + node.val;
  1. 递归还要记录下经过根节点的最大值
    maxSum = Math.Max(lefSum + rightSum + node.val, maxSum);

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
 private int maxSum = 0;
    /// 
    /// 传递的是经过左子树和右子树的根节点的和
    /// 
    /// 
    int Helper(TreeNode node)
    {
        if (node == null) return 0;
        int lefSum = Math.Max(Helper(node.left), 0);
        int rightSum = Math.Max(Helper(node.right), 0);
        //更新
        maxSum = Math.Max(lefSum + rightSum + node.val, maxSum);
        //递归
        return Math.Max(lefSum, rightSum) + node.val;
    }
    public int MaxPathSum(TreeNode root)
    {
        maxSum = int.MinValue;
        Helper(root);
        return maxSum;
    }
}

你可能感兴趣的:(二叉树中的最大路径和(LeetCode 124 -- 使用递归))