題目描述
給定一個二叉樹,找出其最大深度。
二叉樹的深度爲根節點到最遠葉子節點的最長路徑上的節點數。
說明: 葉子節點是指沒有子節點的節點。
示例:
給定二叉樹 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
本題可參考leetcode-559 Maximum Depth of N-ary Tree (N叉樹的最大深度)
思路1:BFS
求深度,就是求共有幾層,自然就想到 層序遍歷 ,關鍵就是用 隊列 來保存樹的層級順序,節點出隊則將其孩子入隊,用for循環來保證將某一層的節點全部出隊,此時表明同一層的節點都處理完畢,層數+1。
// BFS
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int depth = 0;
while (!queue.isEmpty()) {
// 該層的節點數
int size = queue.size();
// 遍歷該層所有節點
for(int i = 0; i < size; i++) {
// 隊頭出隊同時將其子節點都入隊
TreeNode current = queue.poll();
if (current.left != null) queue.offer(current.left);
if (current.right != null) queue.offer(current.right);
}
// 該層節點處理完畢,層數+1
depth++;
}
return depth;
}
}
執行用時:1 ms, 在所有 Java 提交中擊敗了17.49%的用戶
內存消耗:39.8 MB, 在所有 Java 提交中擊敗了5.75%的用戶
思路2:DFS
二叉樹最大的深度 = 左右子樹的最大深度+1
本問題的子問題,就是求子樹的最大深度,由此可以得到遞歸的解法。
// DFS
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1;
}
}
執行用時:0 ms, 在所有 Java 提交中擊敗了100.00%的用戶
內存消耗:39.9 MB, 在所有 Java 提交中擊敗了5.75%的用戶