• 二叉树中的最大路径和 · 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
  • 相关阅读:
    [考试反思]1108csp-s模拟测试105: 傀儡
    [考试反思]1107csp-s模拟测试104: 速度
    联赛前的咕咕咕(小计划)
    [考试反思]1106csp-s模拟测试103: 渺茫
    csp-s模拟测试101的T3代码+注释
    [考试反思]1105csp-s模拟测试102: 贪婪
    [考试反思]1105csp-s模拟测试101: 临别
    [考试反思]1104csp-s模拟测试100: 终结
    [考试反思]1103csp-s模拟测试99: 美梦
    [考试反思]1102csp-s模拟测试98:苟活
  • 原文地址:https://www.cnblogs.com/immiao0319/p/8376474.html
Copyright © 2020-2023  润新知