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代码

猜你喜欢

转载自blog.csdn.net/weixin_48502062/article/details/121390089