• leetcode Binary Tree Maximum Path Sum


    给定一颗数,然后任意的起点或者终点,找到最大的路径和。例如:

    Given the below binary tree,

           1
          / 
         2   3

    Return 6.

    一看到是标hard的题目就觉得要吃力才能搞出来。果然,经过不懈奋斗,成功从Time Limited到AC。

    我看到这题的第一思路就是递归:

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
    //给定一个节点,返回左边单路径或者右边路径包括当前值的最(往上传用的),如果下面两边小于零则值返回自己的值
    int oneSide(TreeNode *root)
    {
        if (!root) return 0;
        if (!root -> left && !root -> right) return root -> val > 0 ? root -> val : 0; 
        else
        {
            int val = max(oneSide(root -> left), oneSide(root -> right));
            val = val > 0 ? val + root -> val : root -> val;
            return val > 0 ? val : 0;
        }
    }
    int curMax(TreeNode *root)
    {
        if (!root) return 0;
        return root -> val + oneSide(root -> left) + oneSide(root -> right);
    }
    //对每个节点遍历求左右两个节点的做大加上本身,然后取最大的值就是maximum path sum了
    int maxPathSum(TreeNode *root)
    {
        if (!root) return 0;
        int tmpl = INT_MIN, tmpr = INT_MIN;
        int cur = curMax(root);
        if (root -> left)
            tmpl = maxPathSum(root -> left);
        if (root -> right)
            tmpr = maxPathSum(root -> right);
        if (cur > tmpl)
            return (cur > tmpr ? cur : tmpr);
        else
            return (tmpl > tmpr ? tmpl : tmpr);
    }
    };

    果断超时了,然后静下心想了调,约两个小时终于终于做出来啦哈哈。

    其实就是进行一次递归的时候同时记录最大值,然后递归完最大值就出来了,所以比之前的递归快了好多。

    /**
     * Definition for binary tree
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Solution {
    public:
    int oneSide2(TreeNode *root, int &maxP)
    {
        if (!root) return 0;
        if (!root -> left && !root -> right)
        {
            maxP = maxP > root -> val ? maxP : root -> val;
            return root -> val > 0 ? root -> val : 0;
        }
        else
        {
            int lf = oneSide2(root -> left, maxP), ri = oneSide2(root ->right, maxP);
            lf = lf > 0 ? lf : 0; ri = ri > 0 ? ri : 0;
            if (lf + ri + root -> val > maxP) maxP = lf + ri + root -> val;
            return root -> val + max(lf, ri) > 0 ? root -> val + max(lf, ri) : 0;
        }
    }
    int maxPathSum(TreeNode *root)
    {
        if (!root) return 0;
        int maxP = INT_MIN;
        oneSide2(root, maxP);
        return maxP;
    }
    };
  • 相关阅读:
    #ifdef的用法
    修改WordPress中上传附件2M大小限制的方法/php+iis上传附件默认大小修改方法
    没有找到libufun.lib,因此这个应用程序未能启动。重新安装应用程序可能会修复此问题。
    JAVA安卓和C# 3DES加密解密的兼容性问题
    使用 Repeater 控件,每隔N条数据输出另外的格式
    Forms表单登陆,动态获取web.config里面的cookies配置
    SQL Server中索引使用及维护
    动态绑定easyui datagrid列名
    Spring Hibernate多数据源配置
    SSH异常处理
  • 原文地址:https://www.cnblogs.com/higerzhang/p/4141553.html
Copyright © 2020-2023  润新知