1. 程式人生 > >LeetCode-二叉樹的最大深度

LeetCode-二叉樹的最大深度

LeetCode-二叉樹的最大深度

Table of Contents

1 Easy-二叉樹的最大深度

給定一個二叉樹,找出其最大深度。

二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。

說明: 葉子節點是指沒有子節點的節點。

1.1 示例:

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

treedept.png

返回它的最大深度 3 。

2 自己的解答

2.1 反思

  1. 這題想了幾種方法,還是不行,最後還是看了答案,才第一次理解了深度優先演算法

3 官方解答

3.1 方法一:遞迴

3.1.1 演算法

  • 直觀的方法是通過遞迴來解決問題。在這裡,我們演示了 DFS(深度優先搜尋)策略的示例。

3.1.2 程式碼

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

3.1.3 複雜度分析

  • 時間複雜度:我們每個結點只訪問一次,因此時間複雜度為 \(O(N)\) , 其中 N 是結點的數量。
  • 空間複雜度:在最糟糕的情況下,樹是完全不平衡的,例如每個結點只剩下左子結點,遞迴將會被呼叫 N 次(樹的高度),因此保持呼叫棧的儲存將是 \(O(N)\) 。但在最好的情況下(樹是完全平衡的),樹的高度將是 \(log(N)\) 。因此,在這種情況下的空間複雜度將是 \(O(log(N))\) 。

3.2 方法二:迭代

  • 我們還可以在棧的幫助下將上面的遞迴轉換為迭代。
  • 我們的想法是使用 DFS 策略訪問每個結點,同時在每次訪問時更新最大深度。
  • 所以我們從包含根結點且相應深度為 1 的棧開始。然後我們繼續迭代:將當前結點彈出棧並推入子結點。每一步都會更新深度。

3.2.1 程式碼

import javafx.util.Pair;
import java.lang.Math;

class Solution {
    public int maxDepth(TreeNode root) {
        Queue<Pair<TreeNode, Integer>> stack = new LinkedList<>();
        if (root != null) {
            stack.add(new Pair(root, 1));
        }

        int depth = 0;
        while (!stack.isEmpty()) {
            Pair<TreeNode, Integer> current = stack.poll();
            root = current.getKey();
            int current_depth = current.getValue();
            if (root != null) {
                depth = Math.max(depth, current_depth);
                stack.add(new Pair(root.left, current_depth + 1));
                stack.add(new Pair(root.right, current_depth + 1));
            }
        }
        return depth;
    }
};

3.2.2 複雜度分析

  • 時間複雜度: \(O(N)\).
  • 空間複雜度: \(O(N)\).

Date: 2018-11-16 00:08

Author: devinkin

Created: 2018-11-16 五 00:08

Validate