zoukankan      html  css  js  c++  java
  • 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)

    题目描述:

    给定一个非空二叉树,返回其最大路径和。

    本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

    示例 1:

    输入: [1,2,3]

    1
    /
    2 3

    输出: 6
    示例 2:

    输入: [-10,9,20,null,null,15,7]

      -10
       /
      9  20
        /  
       15   7

    输出: 42

    解题思路:

      这道题我的想法是分三种情况,分别是过根结点时的最大值,左子树的最大值,右子树的最大值。取三种情况下最大的那个,就得到了总的最大值。这种解法非常复杂,时间空间复杂度都很高。LeetCode官方题解上有更快的解法。

      过根结点的最大值就要求子树中所有路径的最大值,这相当于一个子问题吧,也是这个解法存在大量重复计算的根源,详见源码

      代码如下:

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
        int getMax(TreeNode * p) {
            if (p->left && p->right)
                return max(0, p->val + max(getMax(p->left), getMax(p->right)));
            if (p->left)
                return max(0, p->val + getMax(p->left));
            if (p->right)
                return max(0, p->val + getMax(p->right));
            return max(0, p->val);
        }
    
        int passRootSum(TreeNode * root) {
            int sum = root->val;
    
            if (root->left)
                sum += getMax(root->left);
            if (root->right)
                sum += getMax(root->right);
            return sum;
        }
    
        int maxPathSum(TreeNode* root) {
            vector<int> val_vec;
            if (root->left)
                val_vec.push_back(maxPathSum(root->left));
            if (root->right)
                val_vec.push_back(maxPathSum(root->right));
    
            val_vec.push_back(passRootSum(root));
            return *max_element(val_vec.begin(), val_vec.end());
        }
    };
  • 相关阅读:
    [LeetCode] 55. Jump Game 跳跃游戏
    [LeetCode] 163. Missing Ranges 缺失区间
    [LeetCode] 228. Summary Ranges 总结区间
    获取当时时间和日期
    响应式布局设备分界点
    html5shiv.js分析-读源码之javascript系列
    建站模板开源代码
    js 调试问题
    transform使用参考指南
    浏览器版本过低
  • 原文地址:https://www.cnblogs.com/yxsrt/p/13275261.html
Copyright © 2011-2022 走看看