图解leetcode —— 124. 二叉树中的最大路径和

前言:

每道题附带动态示意图,提供java、python两种语言答案,力求提供leetcode最优解。

描述:

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

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

示例 1:

输入: [1,2,3]

1
/ \
2 3

输出: 6

示例 2:

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

-10
   / \
  9  20
    /  \
   15   7

输出: 42

思路:

java:

class Solution {
    /**
     * 最大路径和
     */
    private int sum = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        maxGain(root);
        return sum;
    }

    public int maxGain(TreeNode node) {
        if (node == null) {
            return 0;
        }
        // 小于0的权值舍弃,代表不走该节点
        int leftGain = Math.max(maxGain(node.left), 0);
        int rightGain = Math.max(maxGain(node.right), 0);

        int pathGain = leftGain + rightGain + node.val;
        sum = Math.max(sum, pathGain);
        // 返回最大路径,路径被定义为一条从树中任意节点出发,达到任意节点的序列。
        return node.val + Math.max(leftGain, rightGain);
    }
}

结果:

python:

import sys

class Solution:
    def maxPathSum(self, root: TreeNode) -> int:
        def max_gain(node: TreeNode) -> int:
            nonlocal max_sum
            if not node:
                return 0
            left_gain = max(max_gain(node.left), 0)
            right_gain = max(max_gain(node.right), 0)

            path_gain = left_gain + right_gain + node.val
            max_sum = max(max_sum, path_gain)

            return node.val + max(left_gain, right_gain)

        # 负无穷
        max_sum = float(‘-inf‘)
        max_gain(root)
        return max_sum

结果:

原文地址:https://www.cnblogs.com/nedulee/p/12019493.html

时间: 2024-07-29 21:57:11

图解leetcode —— 124. 二叉树中的最大路径和的相关文章

[LeetCode] 124. 二叉树中的最大路径和

题目链接 : https://leetcode-cn.com/problems/binary-tree-maximum-path-sum/ 题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例: 示例 1: 输入: [1,2,3] 1 / 2 3 输出: 6 示例 2: 输入: [-10,9,20,null,null,15,7] -10 / 9 20 / 15 7 输出: 42 思路

leetcode:124. 二叉树中的最大路径和

题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不一定经过根节点. 示例 1: 输入: [1,2,3] 1 / 2 3 输出: 6 示例 2: 输入: [-10,9,20,null,null,15,7]   -10    /   9  20     /     15   7 输出: 42 思路分析: 路径问题常规想到的就是用搜索解决.这道题用到了dfs,用递归完成.对于每个结点,计算其左右子树的贡献值,

124. 二叉树中的最大路径和/104. 二叉树的最大深度

我最想刷的递归又来啦,待我先去好好研究一下. 据说T124是T104的进阶,所以先去刷下104 104: 顶层: 即在真正的root节点上,我要返回的是一个数字,而且要比我的左右节点返回的深度大1 def maxDepth(self,root): return max(maxDepth(root.left)+1,maxDepth(root.right)+1) 底层:当遇到叶子节点时候,深度为1,其左右的None 深度为0,所以basecase 应该是叶子节点的再下一层,不要搞错了. if not

LeetCode 671. 二叉树中第二小的节点(Second Minimum Node In a Binary Tree) 9

671. 二叉树中第二小的节点 671. Second Minimum Node In a Binary Tree 题目描述 给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有节点中的第二小的值.如果第二小的值不存在的话,输出 -1. 每日一算法 2019/5/12Day 9 LeetCode671. Second Minimum Node In a B

LeetCode(124):二叉树中的最大路径和

Hard! 题目描述: 给定一个非空二叉树,返回其最大路径和. 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列.该路径至少包含一个节点,且不需要经过根节点. 示例 1: 输入: [1,2,3] 1 / 2 3 输出: 6 示例 2: 输入: [-10,9,20,null,null,15,7]   -10    /   9  20     /     15   7 输出: 42 解题思路: 这道求二叉树的最大路径和是一道蛮有难度的题,难就难在起始位置和结束位置可以为任意位置,像这种

二叉树中的最大路径和

给出一棵二叉树,寻找一条路径使其路径和最大,路径可以在任一节点中开始和结束(路径和为两个节点之间所在路径上的节点权值之和) 样例 给出一棵二叉树: 1 / 2 3 返回 6 1 class Solution { 2 public: 3 /** 4 * @param root: The root of binary tree. 5 * @return: An integer 6 */ 7 struct ResultType { 8 int maxLength; 9 int maxSinglePat

二叉树中所有的路径(从根节点到叶子结点)

1 import java.util.ArrayList; 2 3 /** 4 * 寻找最短的二叉搜索的路径,从根节点到叶子结点 5 * 6 * @author jinfeng 7 * 8 */ 9 public class FindShortestBTPath { 10 11 // 用来记录所有的路径 12 private ArrayList<ArrayList<Integer>> allPaths = new ArrayList<ArrayList<Integer&

二叉树中的最大路径和 &#183; Binary Tree Maximum Path Sum

[抄题]: [思维问题]: [一句话思路]: 用两次分治. [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: 先root-any左右各一次,再用any-any. [一刷]: [二刷]: [三刷]: [四刷]: [五刷]: [总结]: [复杂度]:Time complexity: O(n) Space complexity: O() [英文数据结构,为什么不用别的数据结构]: [其他解法]: 暴力解法 把所有路径找一遍:n^2 [Foll

Leetcode 5346 二叉树中的列表

题目描述: 题解:一开始处理的时候写了个dfs一直超时,其实先用bfs找到所有可能的起始点,对每个起始点dfs一下就可以了. (纯dfs的话,如果树很深的时候,会一直先尝试一个分支到低端,很容易就超时了) AC代码: class Solution { public: int dfs(ListNode* head,TreeNode* root) { if(head == NULL) return 1; if(head != NULL && root==NULL) return -1; //