题目
题目链接:
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}
}