递归实现
public int maxDepth(TreeNode root) {
if (root==null) return 0;
return 1 + Math.max(maxDepth(root.left),maxDepth(root.right));
}
思路:
- 就是取左右节点深度最大值+1(根节点)
- 设置递归终止条件
队列迭代实现
public int maxDepth(TreeNode root) {
if (root==null) return 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int levelSize = 1;
int depth = 0;
while (!queue.isEmpty()){
TreeNode node = queue.poll();
levelSize--;
if (node.left!=null) queue.offer(node.left);
if (node.right!=null) queue.offer(node.right);
if (levelSize==0){
levelSize = queue.size();
depth++;
}
}
return depth;
}
思路
- 如果root==null,直接返回0
- 将root存进队列,并创建depth=0
- 队列弹出节点,levelSize减1
- 用levelSize判断当前层的节点是否完全遍历
- levelSize==0时,将下一层节点数目(即队列大小)赋给levelSize,depth++
- 循环结束返回depth
再贴一下leetcode官方的迭代
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root);
int ans = 0;
while (!queue.isEmpty()) {
int size = queue.size();
while (size > 0) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
size--;
}
ans++;
}
return ans;
}
}
对比我的方法的话,就是可能更直观一点,外循环一次就遍历完一层,即一次外循环,深度加1