题目
给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:3
示例 2:
输入:root = [1,null,2]
输出:2
解题
后序遍历。用的栈,很原始。
func maxDepth(root *TreeNode) int {
if root == nil{
return 0
}
nodeArray := []*TreeNode{root}
max := 1
for len(nodeArray)>0{
if max <len(nodeArray){
max = len(nodeArray)
}
node := nodeArray[len(nodeArray)-1]
if node.Left != nil{
nodeArray = append(nodeArray, node.Left)
node.Left = nil
} else if node.Right != nil{
nodeArray = append(nodeArray, node.Right)
node.Right = nil
} else {
nodeArray = nodeArray[:len(nodeArray)-1]
}
}
return max
}
题解
方法一:深度优先搜索 / 递归
1
func maxDepth(root *TreeNode) int {
if root == nil { return 0 }
return max(maxDepth(root.Left), maxDepth(root.Right)) + 1
}
时间:O(n)
空间:O(height)
方法二:广度优先遍历
2
func maxDepth(root *TreeNode) int {
if root == nil { return 0 }
nodeSlice := []*TreeNode{root}
re := 0
for len(nodeSlice)>0 {
flag := len(nodeSlice)
for _, v:= range nodeSlice{
if v.Left != nil{
nodeSlice = append(nodeSlice, v.Left)
}
if v.Right != nil{
nodeSlice = append(nodeSlice, v.Right)
}
}
nodeSlice = nodeSlice[flag:]
re++
}
return re
}
时间:O(n)
空间:最坏O(n),取决于队列存储的元素数量