zoukankan      html  css  js  c++  java
  • [leetcode]Binary Tree Maximum Path Sum

    #include <iostream>
    #include <vector>
    #include <stack>
    #include <queue>
    using namespace std;
    
    
    
    struct TreeNode {
        int val;
        TreeNode *left;
        TreeNode *right;
        TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    
    /*本题心得:
    0 如何分析一个问题
    1 没有固定格式的判断方式
    2 越界
    */
    
    class Solution {
    public:
        int maxPathSum(TreeNode *root) {
            int pathLen = 0;
            return maxPathSumCore(root, pathLen);
        }
    
        int maxPathSumCore(TreeNode *root, int &pathLen){//pathLen代表从root到下面某个节点的最大距离
            if (!root){
                pathLen = 0;
                return 0;
            }
    
            int leftPathLen;//左子树中某个节点往上走,走到左孩子的最大sum(还未形成path,还可和root甚至右孩子结合)
            int leftSum;//左子树的某个最大sum(已经形成一个path了)
            if (root->left)
                leftSum = maxPathSumCore(root->left, leftPathLen);
            else{
                leftSum = INT_MIN;//左子树的sum(独立path)必须是最负,不能为0,不然如果左孩子是空,但是这里置0,然后leftSum作为独立一个元素,返回给上层时,上层用这个leftSum和root比较,发现比root(root为负数)大,就把root覆盖了
                leftPathLen = 0;//左孩子的path可以为0,因为左孩子如果是叶子,会在和
            }
    
            int rightPathLen;
            int rightSum;
            if (root->right)
                rightSum = maxPathSumCore(root->right, rightPathLen);
            else{
                rightSum = INT_MIN;
                rightPathLen = 0;
            }
            
            pathLen = std::max(root->val, root->val + std::max(leftPathLen, rightPathLen));//到root的最大path,要么是root,要么是root+左子树到左孩子最大值,要么是root+右子树到右孩子最大值(root一定被包含)
    
            int tmp = root->val;
            if (leftPathLen > 0)//如果某个子树的path最大值为负,那么加上也没意义
                tmp += leftPathLen;
            if (rightPathLen > 0)
                tmp += rightPathLen;
            int result = std::max(std::max(root->val, tmp), std::max(leftSum, rightSum));//整体的最大path,1 root;2 通过root的左最大path和/或右最大path;3 左子树中的整体最大path或右子树中的整体最大path
    
            return result;
        }
    };
    
    
    int main()
    {
        TreeNode n1(1);
        TreeNode n2(-2);
        n1.left = &n2;
        Solution s;
        s.maxPathSum(&n1);
        return 0;
    }

    EOF

  • 相关阅读:
    hdu 1698
    ACM起步要点总结(转哈工大)
    RANSAC
    Android 颜色渲染(十) ComposeShader组合渲染
    java过滤html标签函数
    Objective-C ,ios,iphone开发基础:picker控件详解与使用,(实现省市的二级联动)
    简单的三方登录SDK示例,Android Activity之间数据的传递
    搜索引擎日志分析
    继续过中等难度的题目
    包圈圈的题目
  • 原文地址:https://www.cnblogs.com/lihaozy/p/2824307.html
Copyright © 2011-2022 走看看