二叉树中的最大路径和 · Binary Tree Maximum Path Sum

[抄题]:

给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和)

[思维问题]:

不会写分合法

[一句话思路]:

两次分治:root2any any2any分一次,左右再分一次。

[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):

[画图]:

先root-any左右各一次,再用any-any。

[一刷]:

  1. left right都是resultType类型,要用到helper函数
  2. root2Any any2Any都不是helper中的变量,需要重新定义:左边或右边的any2any, 递归才是加上中间的any2any

[二刷]:

  1. root为空的corner case中,any2any并不是0,而是MIN_VALUE,保证其它任何数都比它大。
  2. 没有理解递归的实质:a = left.a,一定要出现相同的变量才行
  3. helper函数要有返回的类型

[三刷]:

[四刷]:

[五刷]:

[总结]:

[复杂度]:Time complexity: O(n) Space complexity: O(n)

 

[英文数据结构,为什么不用别的数据结构]:

[其他解法]:

暴力解法 把所有路径找一遍:n^2

[Follow Up]:

root-leaf 就算有负数也得走:直接左右合并

 root-any node 有负数可以不走:max(0,max(left,right)) + root.val 结果要和0比,小于0就只有root.val得了

[LC给出的题目变变变]:

Path Sum 有几条路径和相同:dc

Sum Root to Leaf Numbers:连起来再求和

Univalue Path:最长的相同节点路径

和二叉树有关的,都不能用遍历,要用recursion

 

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */


public class Solution {
    /*
     * @param root: The root of binary tree.
     * @return: An integer
     */
     class resultType {
       int root2Any;
       int any2Any;
       public resultType (int root2Any, int any2Any) {
           this.root2Any = root2Any;
           this.any2Any = any2Any;
       }
     };
     
     private resultType helper (TreeNode root) {
         if (root == null) {
             return new resultType(0, Integer.MIN_VALUE);
         }
         
         resultType left = helper(root.left);
         resultType right = helper(root.right);
         
         int root2Any = Math.max(left.root2Any, right.root2Any) + root.val;
         root2Any = Math.max(0, root2Any);
         
         int any2Any = Math.max(left.any2Any, right.any2Any);
         any2Any = Math.max(any2Any, Math.max(0,left.root2Any) + root.val + Math.max(0,right.root2Any));
         
         return new resultType(root2Any, any2Any);
     }
     
    public int maxPathSum(TreeNode root) {
        return helper(root).any2Any;
    }
}
View Code

 

posted @ 2018-01-29 11:28  苗妙苗  阅读(354)  评论(0编辑  收藏  举报