2021-11-17:最长同值路径。给定一个二叉树,找到最长的路

2021-11-18 08:26:57 浏览数 (1)

2021-11-17:最长同值路径。给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。力扣687。

答案2021-11-17:

递归。

1.x无关,左最大路和右最大路取最大值。

  1. x有关。 2.1. x自己。 2.2. 左(x) x 右(x)。

代码用golang编写。代码如下:

代码语言:txt复制
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代码

0 人点赞