Given a binary tree, find its maximum depth.
The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node.
Note: A leaf is a node with no children.
Example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its depth = 3.
複製代碼
給定一個二叉樹,求它的最大深度。 最大深度是從根節點到最遠葉節點的最長路徑上的節點數。 注意:葉子是沒有子節點的節點。 例子: 給定二叉樹[3,9,20,null,null,15,7],node
3 / \ 9 20 / \ 15 7 複製代碼
返回結果是3git
本題是獲取一棵樹的深度,通常設計到樹到題仍是有點麻煩到,第一步想到算深度?是否能夠按層級遍歷,不就知道有多少層了嘛。這是一種方式,可是換一個角度想,一棵樹的深度,不就是由它的左右節點決定的嘛,若是有左右節點就加一,同理,左右節點的深度又是由它們的子左右節點決定的,選擇大的那個深度值,貌似就能夠解決此題了github
按照層級遍歷的方式數組
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int result = 1;
//定義一個隊列
List<TreeNode> list = new LinkedList<>();
putNode(root, list);
while (list.size() > 0) {
//經過遍歷的方式把隊列裏面的數據獲取,並把左右子節點塞入
int size = list.size();
while (--size >= 0) {
TreeNode treeNode = list.get(size);
putNode(treeNode, list);
list.remove(size);
}
result++;
}
return result;
}
private void putNode(TreeNode treeNode, List<TreeNode> list) {
if (treeNode == null) {
return;
}
if (treeNode.left != null) {
list.add(treeNode.left);
}
if (treeNode.right != null) {
list.add(treeNode.right);
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
複製代碼
時間複雜度: 該方案用了層級遍歷的方式,時間複雜度至關於每個的遍歷,因此爲O(n)=O(n)bash
空間複雜度: 該方案使用了額外的空間,使用了數組暫存樹,至關於把樹轉化爲了數組,因此空間複雜度O(n)=O(n)ui
遞歸分治法:spa
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
return Math.max(maxDepth(root.left) + 1, maxDepth(root.right) + 1);
}
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
複製代碼
時間複雜度: 該方案用了遞歸遍歷的方式,時間複雜度至關於每個的遍歷,因此爲O(n)=O(n)翻譯
空間複雜度: 該方案沒有使用額外的空間,因此空間複雜度O(n)=O(1)設計
本題的大體解法如上所訴,按層級遍歷其實效果不怎麼理想,我的估計是remove的操做致使的,若是能夠不刪除,直接數組代替樹,效果可能會好一點。code