题目
- 二叉树的直径
题目描述
给定一棵二叉树,你需要计算它的直径长度;一棵二叉树的直径长度是任意两个结点路径长度中的最大值;这条路径可能穿过也可能不穿过根结点。
路径的长度
一条路径的长度为该路径经过的节点减一
思路
二叉树的直径(即求路径长度的最大值)等效于求路径经过节点树的最大值减一
以一个节点的为起点的路径经过节点的最大数值,是左子数经过的节点值+右子数经过的节点值+1
一颗树的路径经过节点的最大值,是所有子数中路径经过节点的最大值
1.主要是思路是通过后续遍历,求每个节点路径所经过的节点最大值
2.定义一个变量保存当前最大值,与每个节点所求的最大值做对比
3.最终最大值-1即为二叉树的直径
深度优先搜索
示例
二叉树
data := &TreeNode{
Val:1,
Left:&TreeNode{
Val:2,
Left:&TreeNode{Val:4},
Right:&TreeNode{Val:5}
},
Right:&TreeNode{Val:3}
}
返回3,它的长度是路径[4,2,1,3]或[5,2,1,3]
代码
package leetcode
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
// diameterOfBinaryTree
// 二叉树的直径
func diameterOfBinaryTree(root *TreeNode) int {
var maxPath int
// 后续遍历二叉树
var postOrder func(root *TreeNode) int
postOrder = func(root *TreeNode) int {
if root == nil{
return 0
}
// 左右子数的最大节点数
leftLen := postOrder(root.Left)
rightLen := postOrder(root.Right)
// 当前节点最大节点数与当前最大节点树对别
maxPath = max(maxPath, leftLen+rightLen+1)
return max(leftLen, rightLen)+1
}
postOrder(root)
// 一条路径的长度为该路径经过的节点减一
if maxPath==0 {
return 0
}
return maxPath-1
}
// max
// 求两个数的最大值
func max(left, right int)int{
if left>right{
return left
}
return right
}
参考
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/di…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。