解法一 Recursion
思路
使用一個 global variable - max 來記錄最大的深度,並在 DFS 遞迴函式中持續更新 max 的值。但由於 int 型別的變數在函式呼叫中是 pass by value 的,所以我用一個整型陣列來儲存最大的那個值,這樣數值就可以在函式呼叫中傳遞了。
我使用了中序遍歷來實現 DFS。
程式碼
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
int[] max = new int[1];
public int maxDepth(TreeNode root) {
if (root == null) return 0;
findDepth(1, root);
return max[0];
}
private void findDepth(int depth, TreeNode node) {
if (node == null) {
return;
}
findDepth(depth + 1, node.left);
max[0] = Math.max(max[0], depth);
findDepth(depth + 1, node.right);
}
}
複雜度分析
- 時間複雜度
- O(n),因為遍歷了樹的所有元素。
- 空間複雜度
- O(H),取決於樹的高度。
解法二 Iteration
思路
簡單來說就是做一個 level-order traversal, 最後記錄最後一層的層數。
程式碼
/**
* 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;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int level = 0;
while (!queue.isEmpty()) {
int levelSize = queue.size();
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
level++;
}
return level;
}
}
複雜度分析
- 時間複雜度
- O(n),BFS 遍歷了每一個元素
- 空間複雜度
- O(n),keep the nodes in the tree
本作品採用《CC 協議》,轉載必須註明作者和本文連結