牛客NC6 二叉树中的最大路径和【hard 二叉树 提供Java Go答案】

题目

在这里插入图片描述
在这里插入图片描述

题目链接:
https://www.nowcoder.com/practice/da785ea0f64b442488c125b441a4ba4a?tpId=196&tqId=37050&rp=1&ru=/exam/company&qru=/exam/company&sourceUrl=%2Fexam%2Fcompany&difficulty=undefined&judgeStatus=undefined&tags=&title=

思路

利用分治法 解决问题
需要一个变量不断记录带有root点的路径的最大值 curr_max 局部变量
需要另一个变量记录当前的最大路径值 max 类变量
最后返回 当前的最大路径值

思路:
有4种情况要考虑
left + root
right + root
root
left + right + root
不断往上传递的值 只可能是 1, 2, 3中的一种
第四种情况只可能保存在 max里面 而不可能在 curr_max

更多参考答案解析请看:https://www.lintcode.com/problem/94/solution/16566

参考答案Java

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return int整型
     */
    public int maxPathSum (TreeNode root) {
        return process(root).max;
        }

        public Info process(TreeNode x) {
            if (x == null) return null;
            Info left = process(x.left);
            Info right = process(x.right);
            int hmax = x.val;
            if (left != null) hmax = Math.max(hmax, left.hmax + x.val);
            if (right != null) hmax = Math.max(hmax, right.hmax + x.val);

            int max = x.val;
            if (left != null) max = Math.max(max, left.max);
            if (right != null) max = Math.max(max, right.max);

            max = Math.max(max, hmax);
            if (left != null && right != null && left.hmax > 0 && right.hmax > 0) {
                max = Math.max(max, left.hmax + right.hmax + x.val);
            }

            return new Info(max, hmax);
        }


        static class Info {
            int max;
            int hmax;

            public Info(int a, int b) {
                max = a;
                hmax = b;
            }
        }
}

参考答案Go

package main

import . "nc_tools"

/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param root TreeNode类
 * @return int整型
 */
func maxPathSum(root *TreeNode) int {
		info := process(root)
	return info[0]
}

func process(x *TreeNode) []int { //对比Java答案 返回值 0位置存放:max  1位置存放 hmax
	if x == nil {
		return nil
	}
	left := process(x.Left)
	right := process(x.Right)
	hmax := x.Val
	if left != nil {
		//hmax = max(hmax, left[1]+x.Val)  go21有该函数
		if left[1]+x.Val > hmax {
			hmax = left[1] + x.Val
		}
	}

	if right != nil {
		if right[1]+x.Val > hmax {
			hmax = right[1] + x.Val
		}
	}

	max := x.Val
	if left != nil {
		if left[0] > max {
			max = left[0]
		}
	}

	if right != nil {
		if right[0] > max {
			max = right[0]
		}
	}

	if hmax > max {
		max = hmax
	}

	if left != nil && right != nil && left[1] > 0 && right[1] > 0 {
		if left[1]+right[1]+x.Val > max {
			max = left[1] + right[1] + x.Val
		}
	}
	return []int{max, hmax}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵长辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值