儘管寫LeetCode解答主要是爲了自己整理思路,但是如果對您也正好有幫助,請點個贊給菜鳥一點鼓勵吧 :-)
原題
解法分析
解法1使用遞歸法;
解法2參考了別人的思路,爲迭代法,類似於廣度優先搜索;
自己的迭代法使用了後序遍歷來統計樹的深度,較爲繁瑣,沒有參考意義。
解法1
解法分析
遞歸計算左子樹的深度與右子樹的深度,那麼樹的深度爲兩個子樹中深度的較大值+1。
代碼
public class Solution104_iterator {
public int maxDepth(TreeNode root) {
if (root == null)
return 0;
Deque<TreeNode> stack = new LinkedList<TreeNode>();
stack.push(root);
int count = 0;
while (!stack.isEmpty()) {
int size = stack.size();
while (size-- > 0) {
TreeNode cur = stack.pop();
if (cur.left != null)
stack.addLast(cur.left);
if (cur.right != null)
stack.addLast(cur.right);
}
count++;
}
return count;
}
}
解法2
參考了https://discuss.leetcode.com/topic/4087/simple-solution-using-java/4
解法分析
類似於廣度優先搜索,使用一個隊列。隊列初始爲空,每次都會加入第i層的所有節點,如果隊列不爲空,說明該層有節點,因此count++;同時,刪除第i層所有的節點,加入第i+1層的所有節點,繼續進行判斷。如果隊列爲空,說明樹已經到底,結束。、
圖解
以下圖所示的樹爲例,深度爲3層。
代碼
public class Solution104_iterator {
public int maxDepth(TreeNode root) {
if (root == null)
return 0;
Deque<TreeNode> stack = new LinkedList<TreeNode>();
stack.push(root);
int count = 0;
while (!stack.isEmpty()) {
int size = stack.size();
while (size-- > 0) {
TreeNode cur = stack.pop();
if (cur.left != null)
stack.addLast(cur.left);
if (cur.right != null)
stack.addLast(cur.right);
}
count++;
}
return count;
}
}