[LeetCode](面試題55 - I)二叉樹的深度

題目

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

例如:

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

    3
   / \
  9  20
    /  \
   15   7

返回它的最大深度 3 。

提示:

  1. 節點總數 <= 10000

解題思路

解法一:後序遍歷(DFS)

樹的深度等於“左子樹的深度”與“右子樹的深度”中的最大值再加上本層節點深度,因此可採用後序遍歷的方式計算樹的深度。

算法步驟:

  • 1)終止條件:當 root​ 爲空,說明已越過葉節點,因此返回深度爲 0 。
  • 2)遞推步驟:
    • 2.1)計算節點 root​ 的左子樹的深度 left = maxDepth(root.left);
    • 2.2)計算節點 root​ 的右子樹的深度 right = maxDepth(root.right);
  • 3)返回值:返回此節點的深度,即 max(left, right) + 1。

複雜度分析:
時間複雜度:O(N)。N 爲樹的節點數量,計算樹的深度需要遍歷所有節點。
空間複雜度:O(N)。最差情況下(當樹退化爲鏈表時),遞歸深度可達到 N。

解法二:層序遍歷(BFS)

計算樹的深度也可採用層次遍歷的方式,而樹的層序遍歷(BFS)往往利用隊列實現。 每遍歷一層,深度 +1,直到遍歷完成,則可得到樹的深度。

算法步驟:

  • 1)特例處理: 當 root​ 爲空,直接返回深度爲 0。
  • 2)初始化: 隊列 queue (加入根節點 root ),計數器 level = 0。
  • 3)當 queue 不爲空時循環遍歷隊列:
    • 3.1)計算本層節點數對應的隊列長度;
    • 3.2)遍歷 queue 中的本層節點 ,並將其左子節點和右子節點加入隊列;
    • 3.3)本層節點遍歷完後,執行 level++ ,代表層數加 1;
  • 4)返回值: 返回 level 即可。

複雜度分析:
時間複雜度:O(N)。N 爲樹的節點數量,計算樹的深度需要遍歷所有節點。
空間複雜度:O(N)。最差情況下(當樹平衡時),隊列 queue 同時存儲 N/2 個節點。

代碼

解法一:(後序遍歷)DFS

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int maxDepth(TreeNode root) {
        if(root==null){
            return 0;
        }
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        return Math.max(left, right) + 1;
    }
}

解法二:(層次遍歷)BFS

class Solution {
    public int maxDepth(TreeNode root) {
        if(root == null){
            return 0;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int level = 0;
        while(!queue.isEmpty()){
            int n = queue.size();
            for(int i=0; i<n; i++){
                TreeNode cur = queue.poll();
                if(cur.left != null){
                    queue.offer(cur.left);
                }
                if(cur.right != null){
                    queue.offer(cur.right);
                }
            }
            level++;
        }
        return level;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章