2021-11-17:最长同值路径。给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。力扣687。
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2021-11-17:最长同值路径。给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。力扣687。相关的知识,希望对你有一定的参考价值。
2021-11-17:最长同值路径。给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。力扣687。
答案2021-11-17:
递归。
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
执行结果如下:
以上是关于2021-11-17:最长同值路径。给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。力扣687。的主要内容,如果未能解决你的问题,请参考以下文章