对Leetcode 104. maximum depth of binary tree 题目的求解。
Problem Description
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
Example 1
Given binary tree [3,9,20,null,null,15,7], return its depth = 3.
Solution 1: Iterative solution
这道题目的描述很符合递归算法的特征,而树又是非常适合递归算法的数据结构,因此我们很容易写出两行的代码。需要注意的只有对空节点的判断。
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
}
}
想要知道树的最大深度,我们只需要进行一次遍历即可。事实上,深度优先和宽度优先的算法都适用与此题。
Solution 2
深度有限遍历。
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
Stack<TreeNode> s= new Stack<TreeNode>();
Stack<Integer> ss= new Stack<Integer>();
s.push(root);
ss.push(1);
int max = 0;
while (!s.isEmpty()){
TreeNode n = s.pop();
int d = ss.pop();
max = Math.max(d, max);
if (n.left != null){
s.push(n.left);
ss.push(d+1);
}
if (n.right != null){
s.push(n.right);
ss.push(d+1);
}
}
return max;
}
Solution 3
宽度优先遍历
public int maxDepth(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> q = new LinkedList<TreeNode>();
Queue<Integer> qq = new LinkedList<Integer>();
q.add(root);
qq.add(1);
int max = 0;
while (!q.isEmpty()){
TreeNode n = q.poll();
int d = qq.poll();
max = Math.max(d, max);
if (n.left != null){
q.add(n.left);
qq.add(d+1);
}
if (n.right != null){
q.add(n.right);
qq.add(d+1);
}
}
return max;
}
Solution 4
事实上,我们还有一种更有效的遍历求解方法,即层次遍历。
public static int maxDepth(TreeNode root) {
if (root == null) return 0;
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.add(root);
int max = 0;
while (!q.isEmpty()){
int size = q.size();
for (int i = 0; i < size; ++i){
TreeNode tmp = q.poll();
if (tmp.left != null) q.add(tmp.left);
if (tmp.right != null) q.add(tmp.right);
}
max += 1;
}
return max;
}