每日一笑:
骑电动车去送儿子上学,校门口碰到他班里一个女生,小女孩刚从她爸的别克上下来,冲儿子讥笑说“你不是说你爸有个宝马吗,原来是这样的宝马啊。”我心想这小子牛吹大了,这下糗了吧,儿子却机智的回答“有宝马需要开给你看吗?我又不打算泡你。”
题目:
给定一个非空二叉树,返回其最大路径和。
本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
示例 1:
输入: [1,2,3]
1
/
2 3
输出: 6
示例 2:
输入: [-10,9,20,null,null,15,7]
-10
/
9 20
/
15 7
输出: 42
思路:
做这道题首先要明白题目中最大路径的意思,简而言之就是以任意节点为起点通过其他节点形成一条路径,使得该路径上的节点值之和最大。
例如:
以题目中的实例二为例,节点15到20到7为最大的路径,所以实例二的最大路径和为42。
我的实现思路是先定义一个最大值的变量,并赋予其范围的最小值,然后通过递归计算每个节点可以产生的最大值,然后用得出的最大值与最大值的变量进行比较,区最大值。
代码实现:
/**树的类 * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ class Solution {
//定义最大值的变量,并赋予其范围内的最小值 int max = Integer.MIN_VALUE; public int maxPathSum(TreeNode root) { maxNumber(root); return max; }
//获取树最大贡献值的方法 public int maxNumber(TreeNode tree) { //定义局部变量,存储当前节点的最大贡献值 int value; //如果树为空,则返回0 if(tree == null) { return 0; } //左右子节点的最大贡献值 int left = maxNumber(tree.left); int right = maxNumber(tree.right); value = tree.val + Math.max(left,0) + Math.max(right,0); //对比贡献值,选择最大的赋值 max = Math.max(max, value); return tree.val + Math.max(Math.max(left,0), Math.max(right,0)); } }
最后附上运行资源使用情况: