美文网首页
求一棵二叉树中相距最远的两个节点之间的距离

求一棵二叉树中相距最远的两个节点之间的距离

作者: 舒小贱 | 来源:发表于2017-11-16 00:10 被阅读0次

问题定义

如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义"距离"为两节点之间边的个数。写一个程序求一棵二叉树中相距最远的两个节点之间的距离。

image

书上的解法

书中对这个问题的分析是很清楚的,我尝试用自己的方式简短覆述。

计算一个二叉树的最大距离有两个情况:

  • 情况A: 路径经过左子树的最深节点,通过根节点,再到右子树的最深节点。
  • 情况B: 路径不穿过根节点,而是左子树或右子树的最大距离路径,取其大者。

只需要计算这两个情况的路径距离,并取其大者,就是该二叉树的最大距离。

image
type node struct {
    data  int
    left  *node
    ritht *node
}

type result struct {
    nMaxDepth    int
    nMaxDistance int
}

//情况A对应的数据
var p9 = &node{9, nil, nil}
var p8 = &node{8, nil, nil}
var p7 = &node{7, nil, nil}
var p6 = &node{6, nil, p9}
var p5 = &node{5, nil, nil}
var p4 = &node{4, p8, nil}
var p3 = &node{3, p6, p7}
var p2 = &node{2, p4, p5}
var p1 = &node{1, p2, p3}
//情况B对应的数据
var n6 = &node{6, nil, nil}
var n5 = &node{5, nil, nil}
var n4 = &node{4, nil, n6}
var n3 = &node{3, n5, nil}
var n2 = &node{2, n3, n4}
var n1 = &node{1, n2, nil}

func getMaxDistance(p *node) result {
    if p == nil {
        return result{-1, -1} //因为如果只有一个节点的时候,nMaxDepth是0(-1+1),nMaxDistance也是0(-1+-1+2)
    }

    l := getMaxDistance(p.left)
    r := getMaxDistance(p.ritht)
    res := result{}
    res.nMaxDepth = max(l.nMaxDepth, r.nMaxDepth) + 1
    res.nMaxDistance = max(max(l.nMaxDistance, r.nMaxDistance), l.nMaxDepth+r.nMaxDepth+2)
    return res
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func main() {
    res1 := getMaxDistance(p1)
    fmt.Println(res1.nMaxDepth, res1.nMaxDistance)
    res2 := getMaxDistance(n1)
    fmt.Println(res2.nMaxDepth, res2.nMaxDistance)
}

运行结果:

C:\Users\minping\Desktop>go run 1.go
3 6
3 4

result中的nMaxDepth很简单,就是max(left depth, rightdepth) +1 (这也是为什么初始值是result{-1, -1}的原因)
result中的nMaxDistance就比较复杂一点,是l.nMaxDistance, r.nMaxDistance(对应B情况,在左子树或者右子树中,不跨根节点)和l.nMaxDepth+r.nMaxDepth+2(对应A情况,跨根节点)三者的最大值。仔细想一想为什么是加2(因为根节点和左右子树通过两条边连接起来的,所以+2)

参考

相关文章

网友评论

      本文标题:求一棵二叉树中相距最远的两个节点之间的距离

      本文链接:https://www.haomeiwen.com/subject/alekvxtx.html