LeetCode-二叉樹的最大深度
阿新 • • 發佈:2018-11-16
LeetCode-二叉樹的最大深度
Table of Contents
1 Easy-二叉樹的最大深度
給定一個二叉樹,找出其最大深度。
二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。
說明: 葉子節點是指沒有子節點的節點。
1.1 示例:
給定二叉樹 [3,9,20,null,null,15,7],
返回它的最大深度 3 。
2 自己的解答
2.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
Created: 2018-11-16 五 00:08