最长同值路径。给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。力扣687。
递归。
1.x无关,左最大路和右最大路取最大值。
2. x有关。
2.1. x自己。
2.2. 左(x)+x+右(x)。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
root := NewTreeNode(5)
root.left = NewTreeNode(4)
root.right = NewTreeNode(5)
root.left.left = NewTreeNode(1)
root.left.right = NewTreeNode(1)
root.right.right = NewTreeNode(5)
ret := longestUnivaluePath(root)
fmt.Println(ret)
}
type TreeNode struct {
val int
left *TreeNode
right *TreeNode
}
func NewTreeNode(v int) *TreeNode {
ret := &TreeNode{}
ret.val = v
return ret
}
func longestUnivaluePath(root *TreeNode) int {
if root == nil {
return 0
}
return process(root).max - 1
}
// 建设以x节点为头的树,返回两个信息
type Info struct {
// 在一条路径上:要求每个节点通过且只通过一遍
len int // 路径必须从x出发且只能往下走的情况下,路径的最大距离
max int // 路径不要求必须从x出发的情况下,整棵树的合法路径最大距离
}
func NewInfo(l, m int) *Info {
ret := &Info{}
ret.len = l
ret.max = m
return ret
}
func process(x *TreeNode) *Info {
if x == nil {
return NewInfo(0, 0)
}
l := x.left
r := x.right
// 左树上,不要求从左孩子出发,最大路径
// 左树上,必须从左孩子出发,往下的最大路径
linfo := process(l)
// 右树上,不要求从右孩子出发,最大路径
// 右树上,必须从右孩子出发,往下的最大路径
rinfo := process(r)
// 必须从x出发的情况下,往下的最大路径
len0 := 1
if l != nil && l.val == x.val {
len0 = linfo.len + 1
}
if r != nil && r.val == x.val {
len0 = getMax(len0, rinfo.len+1)
}
// 不要求从x出发,最大路径
max := getMax(getMax(linfo.max, rinfo.max), len0)
if l != nil && r != nil && l.val == x.val && r.val == x.val {
max = getMax(max, linfo.len+rinfo.len+1)
}
return NewInfo(len0, max)
}
func getMax(a int, b int) int {
if a > b {
return a
} else {
return b
}
}
执行结果如下: