算法练习:二叉树中的最大路径和

每日一笑:

骑电动车去送儿子上学,校门口碰到他班里一个女生,小女孩刚从她爸的别克上下来,冲儿子讥笑说“你不是说你爸有个宝马吗,原来是这样的宝马啊。”我心想这小子牛吹大了,这下糗了吧,儿子却机智的回答“有宝马需要开给你看吗?我又不打算泡你。”

题目:

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

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

示例 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)); } }

最后附上运行资源使用情况:

原文地址:https://www.cnblogs.com/xjl-raynor/p/13172900.html