zoukankan      html  css  js  c++  java
  • 算法练习:二叉树中的最大路径和

    每日一笑:

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

    题目:

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

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

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

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

  • 相关阅读:
    自定义simple_tag
    测试流程规范系列(2):测试计划
    测试流程规范系列(4):测试准入
    测试流程规范系列(3):测试用例
    测试流程规范系列(1):测试流程
    Jmeter系列(1):安装
    Jmeter系列(2):简介
    Jmeter系列(3):使用
    Jmeter系列(4):插件
    Jmeter系列(5):参数化
  • 原文地址:https://www.cnblogs.com/xjl-raynor/p/13172900.html
Copyright © 2011-2022 走看看