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
    


执行结果如下:


左神java代码

以上是关于2021-11-17:最长同值路径。给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。力扣687。的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode687----最长同值路径

687. 最长同值路径

每日一题687. 最长同值路径

最长同值路径(力扣第687题)

687. 最长同值路径

LeetCode 687 最长同值路径[dfs] HERODING的LeetCode之路