[每日一題] 第三題:二叉樹的深度

DRose發表於2020-07-28

輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉節點依次經過的節點(含根、葉節點)形成樹的一條路徑,最長路徑的長度為樹的深度。

例如:

給定二叉樹 [3,9,20,null,null,15,7]

   3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

提示:

節點總數 <= 10000

後續遍歷(DFS)

演算法思想

樹的後續遍歷/深度遍歷往往利用 或者 遞迴 實現,本文使用遞迴實現

關鍵點:此數的深度和其左(右)子樹的深度之間的關係。顯然,此樹的深度 等於 左子樹的深度右子樹的深度 中的 最大值 +1 。

演算法解析

  1. 終止條件:當 root 為空,說明已越過葉節點,因此要返回深度 0。

  2. 遞迴工作:本質上是要對樹做後續遍歷。

    1. 計算節點 root 的左子樹的深度,即呼叫 maxDepth(root.left)

    2. 計算節點 root 的右子樹的深度,即呼叫 maxDepth(root.left)

  3. 返回值: 返回 此樹的深度 ,即 max(maxDepth(root.left), maxDepth(root.right)) + 1

複雜度

時間複雜度 O(N) : N 為樹的節點數量,計算樹的深度需要遍歷所有節點。

空間複雜度 O(N) : 最差情況下(當樹退化為連結串列時),遞迴深度可達到 N 。

程式碼

class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null) return 0;
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
}

個人理解

直接記住即可。

層序遍歷(BFS)

樹的層序遍歷 / 廣度優先搜尋往往利用 佇列 實現。

關鍵點: 每遍歷一層,則計數器 +1 ,直到遍歷完成,則可得到樹的深度。

演算法解析

特例處理: 當 root 為空,直接返回 深度 0。

初始化: 佇列 queue (加入根節點 root),計數器 res = 0

迴圈遍歷: 當 queue 為空時跳出。

初始化一個空列表 tmp ,用於臨時儲存下一層節點;

遍歷佇列: 遍歷 queue 中的各節點 node,並將其左子節點和右子節點加入 tmp

更新佇列: 執行 queue = tmp ,將下一層節點賦值給 queue

統計層數: 執行 res += 1 ,代表層數加 1;

返回值: 返回 res 即可。

程式碼

class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null) return 0;
        List<TreeNode> queue = new LinkedList<>() {{ add(root); }}, tmp;
        int res = 0;
        while(!queue.isEmpty()) {
            tmp = new LinkedList<>();
            for(TreeNode node : queue) {
                if(node.left != null) tmp.add(node.left);
                if(node.right != null) tmp.add(node.right);
            }
            queue = tmp;
            res++;
        }
        return res;
    }
}

個人理解

記住即可。

作者:jyd
連結:leetcode-cn.com/problems/er-cha-sh...
來源:力扣(LeetCode)

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章