二叉树中的最大路径和

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

样例

给出一棵二叉树:

       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 maxSinglePath;
10         ResultType(int a, int b) : maxLength(a), maxSinglePath(b) {}
11     };
12     int maxPathSum(TreeNode *root) {
13         if (root == NULL) {
14             return 0;
15         }
16         return helper(root).maxLength;
17     }
18
19     ResultType helper(TreeNode *root) {
20         if (root == NULL) {
21             return ResultType(INT_MIN, INT_MIN);
22         }
23
24         ResultType left = helper(root->left);
25         ResultType right = helper(root->right);
26
27         int maxSinglePath = std::max(0, std::max(left.maxSinglePath, right.maxSinglePath))
28                             + root->val;
29         int maxCrossLength = std::max(0, left.maxSinglePath)
30                             + std::max(0, right.maxSinglePath)
31                             + root->val;
32         int maxLength = std::max(left.maxLength, right.maxLength);
33         maxLength = std::max(maxLength, maxCrossLength);
34         return ResultType(maxLength, maxSinglePath);
35     }
36 };
时间: 2024-12-30 14:01:44

二叉树中的最大路径和的相关文章

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 解题思路: 这道求二叉树的最大路径和是一道蛮有难度的题,难就难在起始位置和结束位置可以为任意位置,像这种

[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,用递归完成.对于每个结点,计算其左右子树的贡献值,

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

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

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

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

二叉树中节点的最大距离(树的最长路径)——递归解法

上一篇文章说的是该题的一种变形,并给出了非递归解法. 现在我给出原题的一种递归解法.将会看到,现比较上篇博文,今天给出的递归解法的代码实现是相当简洁的. 问题描述: 如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数. 写一个程序,求一棵二叉树中相距最远的两个节点之间的距离.测试用的树: n1 /             \ n2             n3 /        \ n4          n5 /     \    

二叉树中存在路径等于给定值

题目:输入一个二叉树和一个整数,打印出二叉树中所有和给定整数值相等的路径. 分析:先画图 明白几点: 1)根据题意,我们是要遍历整个树才能确定所有符合条件的路径.显然应该从根节点出发,那么我们就应该采用先序遍历.这里遍历就采用递归更简单. 2)遍历完了后如何保存路径呢?这里我们是采用vector而不是stack因为遍历的时候从根节点打印. 每次遍历一个结点,就将其压栈,当前结点访问结束后,递归函数将自动回到父节点,因此我们在函数退出之前要在路径上删除当前结点并减去当前结点的值. #include