资讯专栏INFORMATION COLUMN

力扣(LeetCode)124

geekidentity / 1467人阅读

题目地址:
https://leetcode-cn.com/probl...
题目描述:

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

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

示例 1:

输入: [1,2,3]

       1
      / 
     2   3

输出: 6
示例 2:

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

   -10
   / 
  9  20
    /  
   15   7

输出: 42

解答:
这一题,看上去,根本不可能做出来!为什么呢?因为这里的路径和很特别,它可以是从任意点到任意点的路径,搜索我都搜索不出来,按照定义路径可以是从一个叶子到另一个叶子,比如这样:

   -10
   / 
  9  20
    /  
   15   7
   

15->20->7,这条路径,怎么搜索?搜索的代码都写不出来!!!
那么只能放弃了。。。
我认为直接求路径和这题是无解的,写不出代码。而这一题我是求别的东西,顺带求出了答案。

但是想一下下面的几个简单问题,这个问题就能做出来了!
(如果跳过这几个简单问题直接看答案,除非你天赋异禀,否则能看懂那你这思维也是没谁了)

二叉树的深度怎么求?

int depth(TreeNode root)
{
if(root == null)return 0;
return 1+Math.max(depth(root.left),depth(root.right));
}

二叉树的深度等于,max(左子树的深度,右子树的深度)+1。

假设二叉树的val字段为int类型。
基于求深度的思想,进阶一下求节点到节点的最大路径和

int maxSum(TreeNode root)
{
if(root == null)return 0;
 return root.val + Math.max(maxSum(root.left),maxSum(root.right));
}

根到叶的最大路径和等于max(左子树根到叶最大路径和,右子树根到叶最大路径和)+root.val。

现在求,根节点到某一子节点,使得该路径和最大,该子节点可以不是叶子节点,给出最大路径长度。
how?
这个和上面那俩其实是一个原理,给这个函数起个名字叫做"根向下最大延申"
那么算法是:
int temp =max(左子树根向下最大延申,右子树根向下最大延申)。
若temp > 0,则根向下最大延申=root.val+temp,否则根向下最大延申=root.val
代码为:

 int dfs(TreeNode root)
    {
        if(root == null)return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        int temp = Math.max(left,right);
        if(temp > 0)
            temp += root.val;
        else
            temp = root.val;

        return temp;
    }

求出上面这个有什么用!!!???用处实在是太大了啊啊啊啊啊!!!!!
求出了上面这个,这个问题就基本可解了!!!
为什么呢?
我们这么想,给我任意一个树的节点root,现在给这个"根向下最大延申"函数起个英文名叫做dfs。那么经过这个节点的最大路径和只可能是下面几种情况:
1、
root.val
该节点本身值。
2、
dfs(root.left)+root.val,该节点本身值+左子树向下最大延申。
此时dfs(root.left) > 0 && dfs(root.right) <= 0。
3、
dfs(root.right)+root.val,该节点本身值+右子树向下最大延申。
此时dfs(root.left) <= 0 && dfs(root.right) > 0。
4、dfs(root.left)+dfs(root.right)+root.val
该节点本身值+左右子树向下最大延申。
此时dfs(root.left) > 0 && dfs(root.right) > 0。

上面四种情况包含了经过这个节点的最大路径和的所有可能
虽然不能求出任意点任意点的路径和,但是已经可以得到该题的解了!!!
(读者可以想想为什么不求出任意点到任意点的路径和也能求出答案)
因此,对于任意一个节点root,求出经过该节点的最大路径和,然后和全局答案
进行比较,更新全局答案为最大值,就能够求出这一题的答案!!!

java ac代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxPathSum(TreeNode root) {
        
        if(root == null)return 0;
        dfs(root);
        return ans;
        
    }
    int ans = Integer.MIN_VALUE;
    //求该点能向下延申的最大值
    int dfs(TreeNode root)
    {
        if(root == null)return 0;
        int left = dfs(root.left);
        int right = dfs(root.right);
        
        int temp = Math.max(left,right);
        if(temp > 0)
            temp += root.val;
        else
            temp = root.val;
        
        int val = root.val;
        if(left >= 0)val += left;
        if(right >= 0)val += right;
        ans = Math.max(ans,val);
        return temp;
    }
}

Amazing!!!
代码如此优美,每个节点只被访问一次,使得时间效率应该也是最优的,并且还能求出答案,真是Unbelievable!
这题还能这么解!!!这题让求最大路径和,实际上是求根节点向下最大延申,而路径和只是顺带着求出来的。

为什么不直接给出答案?这是一道hard的题目,如果不写前面的铺垫直接给出答案,多半是看不懂的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74297.html

相关文章

  • 力扣(LeetCode)43

    摘要:示例输入输出示例输入输出说明和的长度小于。和均不以零开头,除非是数字本身。举例说明这两个数的乘积的长度一定不会超过,分别是字符串的长度。第一轮第二轮至此该数组变为然后再从尾部处理进位。 题目地址:https://leetcode-cn.com/probl...题目描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字...

    itvincent 评论0 收藏0
  • 力扣(LeetCode)310

    摘要:图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。因此使用一个数组代表每个节点的入度,若入度为就是叶子节点。 题目地址:https://leetcode-cn.com/probl...题目描述: 对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小...

    amuqiao 评论0 收藏0
  • LeetCode天梯>Day026 反转链表(递归法+(迭代法)双链表法) | 初级算法 | Py

    摘要:关于递归这里提一两点递归基本有这几步递归的模板,终止条件,递归调用,逻辑处理。 ?作者简介:大家好,我是车神哥,府学路18号的车神? ?个人主页:应无所住而生...

    imingyu 评论0 收藏0
  • 力扣(LeetCode)452

    摘要:对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。可以射出的弓箭的数量没有限制。弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。解答这是一道区间覆盖问题,不太好说清楚,利用模板即可。 题目地址:https://leetcode-cn.com/probl...题目描述:在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方...

    fanux 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<