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,用递归完成。对于每个结点,计算其左右子树的贡献值,更新当前的最大路径为原始最大路径和左子树贡献加当前结点加右子树贡献和中较大的一个。需要注意的是计算左右子树贡献的时候,需要将取贡献值和0中的较大值,因为结点权值可能为负。同时递归函数的返回值应该为左右子树中贡献较大的加上当前结点权值。

时间复杂度为O(n),n为树中结点个数。

代码:

 1 /**
 2  * Definition for a binary tree node.
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     int max_sum = INT_MIN;
13     int get_max(TreeNode* cur)
14     {
15         if(cur == NULL)
16             return 0;
17         int leftmax = max(get_max(cur->left), 0);
18         int rightmax = max(get_max(cur->right), 0);
19         max_sum = max(max_sum, leftmax+cur->val+rightmax);
20         return max(leftmax, rightmax) + cur->val;
21     }
22     int maxPathSum(TreeNode* root) {
23         if(!root)
24             return 0;
25         get_max(root);
26         return max_sum;
27     }
28 };

原文地址:https://www.cnblogs.com/LJ-LJ/p/11203368.html

时间: 2024-08-11 14:29:46

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

图解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

[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 思路

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; //