二叉树的最大路径和

http://www.lintcode.com/zh-cn/problem/binary-tree-maximum-path-sum/#

注意点:  root == null ,return Integer.MIN_VALUE  就说明为了一定排除这个结点,将这个结点值设为最小值,也说明路径中是至少包含一个结点的。

      最后结果一定得至少包含一个结点,不然maxPathSum也不包含结点,如果树中val都是负数,会返回0,而实际上应该返回树中的最大的负数。

      -3

-2      -1        要返回-1而不是0.

//根节点到任一节点的单一路径最大值
private int maxSinglePathSum(TreeNode root) {
if(root == null) return 0;   
int left = maxSinglePathSum(root.left);
int right = maxSinglePathSum(root.right);
return Math.max(Math.max(left,right),0) + root.val;
}

包不包含结点的差别在    null时的return和 singleMax, sumMax的选择上,看答案吧还是,逻辑更清楚点。

http://www.jiuzhang.com/solutions/binary-tree-maximum-path-sum/

//singleMax 包含至少一个结点,maxPathSum必须包含至少一个结点。

 1 class ResultType {
 2        int singleMax;
 3        int sumMax;
 4        public ResultType(int singleMax, int sumMax){
 5            this.singleMax = singleMax;
 6            this.sumMax = sumMax;
 7        }
 8    }
 9    private ResultType helper(TreeNode root) {
10        if(root == null) return new ResultType(Integer.MIN_VALUE, Integer.MIN_VALUE); //如果当前结点为null,怎么都不会选这个结点加入结果行列,
11                                                                      //所以一会取Max()筛选时,为了保证这个结点被筛除,设为
12                                                                      // Integer.MIN_VALUE。此处也说明,sumMax至少包含一个结点。
13         ResultType left = helper(root.left);
14         ResultType right = helper(root.right);
15         int singleMax = Math.max(Math.max(left.singleMax,right.singleMax),0) + root.val;
16         int sumMax = Math.max(Math.max(left.sumMax,right.sumMax),Math.max(0,left.singleMax) + Math.max(0,right.singleMax) + root.val);
17         return new ResultType(singleMax, sumMax);
18    }
19  public int maxPathSum(TreeNode root) {
20      return helper(root).sumMax;
21  }

//singleMax 可以不包含结点

 1 class ResultType {
 2        int singleMax;
 3        int sumMax;
 4        public ResultType(int singleMax, int sumMax){
 5            this.singleMax = singleMax;
 6            this.sumMax = sumMax;
 7        }
 8    }
 9    private ResultType helper(TreeNode root) {
10        //差别1
11        if(root == null) return new ResultType(0, Integer.MIN_VALUE);
12
13         ResultType left = helper(root.left);
14         ResultType right = helper(root.right);
15         int singleMax = Math.max(Math.max(left.singleMax,right.singleMax),0) + root.val;
16         //差别3  这一行可有可无,其实前面的约束已经足够了,所以这一行没必要写,写了也不影响,只是多余操作而已。
17         singleMax = Math.max(singleMax, 0);
18
19         //差别2
20         int sumMax = Math.max(Math.max(left.sumMax,right.sumMax),Math.max(0,left.singleMax) + Math.max(0,right.singleMax) + root.val);
21
22         return new ResultType(singleMax, sumMax);
23    }
24  public int maxPathSum(TreeNode root) {
25      return helper(root).sumMax;
26  }
27  

时间: 2024-10-15 11:21:01

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

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

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

[LeetCode] Binary Tree Maximum Path Sum 求二叉树的最大路径和

Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example:Given the below binary tree, 1 / 2 3 Return 6. 这道求二叉树的最大路径和是一道蛮有难度的题,难就难在起始位置和结束位置可以为任意位置,我当然是又不会了,于是上网看看大神们的解法,看了很多人的都没太看明白,最后发现了网友Yu's C

lintcode:二叉树的所有路径

二叉树的所有路径 给一棵二叉树,找出从根节点到叶子节点的所有路径. 样例 给出下面这棵二叉树: 1 / 2 3 5 所有根到叶子的路径为: [ "1->2->5", "1->3" ] 解题深度优先 可以转换成先序遍历:根左右,根结点遍历以后,遍历两个子树,是叶子结点的时候保存路径 /** * Definition of TreeNode: * public class TreeNode { * public int val; * public Tr

【leetcode 简单】 第七十一题 二叉树的所有路径

给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1 / 2 3 5 输出: ["1->2->5", "1->3"] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3 # Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x

DS树+图综合练习--二叉树之最大路径

题目描述 给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符'0'表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构 二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径,每条路径的权值等于路径上所有结点的权值和.编程求出二叉树的最大路径权值.如下图所示,共有4个叶子即有4条路径, 路径1权值=5 + 4 + 11 + 7 = 27          路径2权值=5 + 4 + 11 + 2 = 22 路径3权值=5 + 8 + 13 = 26            

DS树--二叉树之最大路径

题目描述 给定一颗二叉树的逻辑结构(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构 二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径,每条路径的权值等于路径上所有结点的权值和.编程求出二叉树的最大路径权值.如下图所示,共有4个叶子即有4条路径, 路径1权值=5 + 4 + 11 + 7 = 27          路径2权值=5 + 4 + 11 + 2 = 22 路径3权值=5 + 8 + 13 = 26            

求二叉树最长路径和

题目: Binary Tree Maximum Path Sum Given a binary tree, find the maximum path sum. The path may start and end at any node in the tree. For example:Given the below binary tree, 1 / 2 3 Return 6. 分析: 节点可能为负数,寻找一条最路径使得所经过节点和最大.路径可以开始和结束于任何节点但是不能走回头路. 这道题虽

480 二叉树的所有路径

原题网址:https://www.lintcode.com/problem/binary-tree-paths/description 描述 给一棵二叉树,找出从根节点到叶子节点的所有路径. 您在真实的面试中是否遇到过这个题?  是 样例 给出下面这棵二叉树: 1 / 2 3 5 所有根到叶子的路径为: [ "1->2->5", "1->3" ] 标签 二叉树遍历 二叉树 思路: AC代码: /** * Definition of TreeNode

257. 二叉树的所有路径 | Binary Tree Paths

Given a binary tree, return all root-to-leaf paths. Note: A leaf is a node with no children. Example: Input: 1 / 2 3 5 Output: ["1->2->5", "1->3"] Explanation: All root-to-leaf paths are: 1->2->5, 1->3 给定一个二叉树,返回所有从根节

二叉树的所有路径与旋转数组

解题思路:先判断当前节点是否为空,不为空则加入路径中,若不为空,判断该节点是否为叶子节点,为叶子节点则将路径加入答案,否则继续递归左右子树. 给定一个二叉树,返回所有从根节点到叶子节点的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 输入: 1/ \2 3\5 输出: ["1->2->5", "1->3"] 解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3 class Solution { public