此題是一道簡單題,目的是為了開始釐清 DFS 和 BFS 演算法的思路。
解法一 DFS
思路
首先想到如果給的陣列是 null 則返回深度為零。可以這麼想:一個節點的深度,就是它的 left child 和 right child 中深度較大的那個加一。
程式碼
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
} else {
int left = maxDepth(root.left);
int right = maxDepth(root.right);
return Math.max(left, right) + 1;
}
}
}
複雜度分析
- 時間複雜度
- 所有結點都會經過一次, O(N)
- 空間複雜度 O(1)
- 最好情況: N 個節點形成了完全二叉樹,recursion 執行 O(logN) 次
- 最壞情況: N 個節點都只有左孩子,recursion 執行 O(N) 次
解法二 Iteration
思路
使用 Stack 的 DFS。
對於一個節點,如果存在左節點或右節點,那麼入棧,深度加一。
下一次 iteration 時,把入棧的節點彈出,查詢該節點是否還有子節點。
有的話入棧,深度加一。沒有就不用操作了,只是將這個節點出棧。
iteration 的過程直到棧中沒有任何節點為止。
程式碼
class solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
LinkedList<TreeNode> stack = new LinkedList<>();
LinkedList<Integer> level = new LinkedList<>();
// Initialize the LinkedList
stack.push(root);
level.push(1);
// Set the template to store node and max depth
TreeNode temp;
int curr_level, maxDepth = 0;
while (!stack.isEmpty()) {
temp = stack.pop(); // get the latest node in the stack
curr_level = level.pop(); // get the corresponding depth of the node
maxDepth = Math.max(maxDepth, curr_level); // 始終保持 max 最大
if (temp.left != null) {
stack.push(temp.left);
level.push(curr_level+1);
}
if (temp.right != null) {
stack.push(temp.right);
level.push(curr_level+1);
}
}
return maxDepth;
}
}
Takeaway
- 在此過程中,發現 LinkedList 同時具備 queue 和 stack 的功能。但需要建立時注意,使用
LinkedList
開頭,不能使用list
。因為 List 介面中沒有 push, add, poll 等方法。- 對 Linkedlist 介面方法的總結:
- 從 List 繼承而來的: add() - 直接在 LinkedList 末端加入元素; remove() - 移除頂部元素; add(1, element) - 在 index = 1 的地方加入元素; set(1, element) - 在 index = 1 的地方替換元素
- LinkedList 自帶方法: push() - 推入棧頂; pop(), poll()- 從棧頂出棧; pollLast(), pollFirst(), removeLast(); removeFirst() 顧名思義。
- 對 Linkedlist 介面方法的總結:
本作品採用《CC 協議》,轉載必須註明作者和本文連結