type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
type Node struct {
Val int
Children []*Node
}
func max(a, b int) int {
if a < b {
return b
}
return a
}
func min(a, b int) int {
if a > b {
return b
}
return a
}
func maxDepth(root *TreeNode) int {
if root == nil {
return 0
}
//采用后序遍历左右中
l := maxDepth(root.Left)
r := maxDepth(root.Right)
if l < r {
return 1 + r
} else {
return 1 + l
}
}
func maxDepth2(root *Node) int {
if root == nil {
return 0
}
//原理与二叉树一样,只不过左右替换为循环判断,找出最大值
var depth int
for i := 0; i < len(root.Children); i++ {
depth = max(depth, maxDepth2(root.Children[i]))
}
return depth + 1
}
func minDepth(root *TreeNode) int {
if root == nil {
return 0
}
//依旧采用后序遍历,但求的是叶子结点的最小深度,因此要去掉root节点情况
if root.Left == nil && root.Right != nil {
return 1 + minDepth(root.Right)
}
if root.Right == nil && root.Left != nil {
return 1 + minDepth(root.Left)
}
return min(minDepth(root.Left), minDepth(root.Right)) + 1
}
func countNodes(root *TreeNode) int {
if root == nil {
return 0
}
//依旧采用后序遍历左右中
l := countNodes(root.Left)
r := countNodes(root.Right)
return l + r + 1
}