做好每一件事,读好每一本书,天道酬勤
二叉树的最大深度
2022-01-10 / 3 min read

二叉树的最大深度。我们使用什么方法去破解?

# 题目
给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:
给定二叉树 [3,9,20,null,null,15,7],

  3
/  \

9 20
/
15 7
返回它的最大深度 3

思考

拿到这个题目我们最先想到的就是层序遍历,为什么呢?
我们首先要明白层序遍历我们最后的结果是什么,层序遍历我们最后得到的是一个二位数组。
那我们换个角度去看他,最大的深度是不是就是层序遍历最后二维数组的层数。答案是肯定的。
上面是我最先能使用的方法。

解题

这里解题的方式有两种

递归法

这里我们回顾一下递归的三个要素。根据三要素来书写代码。
1. 确定输入和返回值
2. 确定终止条件
3. 确定单层逻辑
那么下面我们来详细的书写一下代码
首先我们确定输入和返回值,这里我们首先输入的肯定是节点,然后返回的是深度

 function fun(){
    func getDepths(root *TreeNode) int
 }
 fun();

第二步是确定终止的条件,这里我们终止的条件是节点是nil
if root ==nil{
return 0
}
第三步确定单层的逻辑
Left := getDepths(root.Left)
Right := getDepths(root.Right)
deth := 1 + max(Left,Right)
这里需要注意的是,我们最后得到的是高度,这里的高度是需要加一的。

最后的源码:

func maxDepth(root *TreeNode) int {
   return getDepths(root)
}

func getDepths(root *TreeNode) int{
    if root ==nil{
        return 0
    }
    Left := getDepths(root.Left)
    Right := getDepths(root.Right)
    deth := 1 + max(Left,Right)
    return deth
}

func max(Left,Right int)int{
    if Left > Right{
        return Left
    }
        return Right
}

迭代法

这个方法也就是我之前想到的那个方法,也就是使用层讯遍历去完成这个题目,这里我们就不在过多的解析
在后面的层序遍历的地方我会把这段代码详细的解析一遍。

func maxDepth(root *TreeNode) int {
    var res [][]int
    if root == nil{
        return 0
    }
    st:= list.New()
    st.PushBack(root)
    var Arrtem []int
    for st.Len() > 0{
        lenth := st.Len()
        for i := 0;i<lenth;i++{
            node := st.Remove(st.Front()).(*TreeNode)
            if node.Left != nil{
                st.PushBack(node.Left)
            }
            if node.Right != nil{
                st.PushBack(node.Right)
            }
            Arrtem = append(Arrtem,node.Val)
        }
        res  = append(res,Arrtem)
        Arrtem = []int{}
    }
    result := len(res)
  return result
}