美文网首页算法练习
二叉树中的最大路径和(LeetCode 124 -- 使用递归)

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

作者: 倚剑赏雪 | 来源:发表于2020-02-24 23:56 被阅读0次

题目

给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 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;
    /// <summary>
    /// 传递的是经过左子树和右子树的根节点的和
    /// </summary>
    /// <returns></returns>
    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 -- 使用递归)

    本文链接:https://www.haomeiwen.com/subject/loqnqhtx.html