Skip to content

Latest commit

 

History

History
123 lines (92 loc) · 2.24 KB

124.md

File metadata and controls

123 lines (92 loc) · 2.24 KB

124. Binary Tree Maximum Path Sum

Leetcode 链接

题目

Given a non-empty binary tree, find the maximum path sum.

For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The path must contain at least one node and does not need to go through the root.

Example 1:

Input: [1,2,3]

       1
      / \
     2   3

Output: 6
Example 2:

Input: [-10,9,20,null,null,15,7]

   -10
   / \
  9  20
    /  \
   15   7

Output: 42

题意解析

在二叉树中找出一条路径,该路径和最大。注意:该路径可能没有经过根节点,也可能不包含叶子节点。

解决方案

先把问题分为两种情况:(1)该路径包含根节点 (2)该路径不包含根节点,该路径处于根节点的左子树或者右子树中。

  • 如下代码中,'initMap' 函数的作用是求出从叶子节点到当前节点的最大的路径和

Go 代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */

var mm map[*TreeNode]int

func maxPathSum(root *TreeNode) int {
	mm = make(map[*TreeNode]int)
	initMap(root)
	return helper(root)
}

func helper(root *TreeNode) int {
	withoutRoot := 0
	switch {
	case root == nil:
		return 0

	case isLeaf(root):
		return root.Val

	case root.Left == nil:
		withoutRoot = helper(root.Right)

	case root.Right == nil:
		withoutRoot = helper(root.Left)

	default:
		withoutRoot = max(helper(root.Left), helper(root.Right))
	}

	withRoot := root.Val
	if mm[root.Left] > 0 {
		withRoot += mm[root.Left]
	}
	if mm[root.Right] > 0 {
		withRoot += mm[root.Right]
	}

	return max(withRoot, withoutRoot)
}

func initMap(root *TreeNode) (res int) {
	switch {
	case root == nil:
		res = 0

	case isLeaf(root):
		mm[root] = root.Val
		if root.Val < 0 {
			res = 0
		} else {
			res = root.Val
		}

	default:
		mm[root] = max(initMap(root.Left), initMap(root.Right)) + root.Val
		res = mm[root]
	}

	return
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func isLeaf(root *TreeNode) bool {
	return root.Left == nil && root.Right == nil
}