题目
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-cha-shu-de-shen-du-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归法
树中每一个节点的深度都满足depth = max(左子树深度, 右子树深度)+1
,因此可以使用递归的方法求解,递归出口为叶子节点处,返回0。实际上就是后序遍历
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
}
层序遍历法
遍历二叉树的每一层,访问每一层时将计数器加1,这里需要用到两个队列,第一个队列nowLevel
用来记录当前层的所有节点,第二个队列nextLevel
用来记录下一层的所有节点,每次循环时将nextLevel
的所有节点添加到nowLevel
中,然后再遍历nowLevel
中的每个节点,并将其左右孩子节点添加到nextLevel
中,将计数器+1。
这里实际上使用了层序遍历的思想,层序遍历时是将当前节点的孩子节点添加到同一个队列的尾部,此处为了区分上下两层的节点从而方便计数,便将孩子节点添加到nextLevel
中
class Solution {
public int maxDepth(TreeNode root) {
if (root == null)
return 0;
Queue<TreeNode> nowLevel = new LinkedList<TreeNode>();
Queue<TreeNode> nextLevel = new LinkedList<TreeNode>();
nextLevel.offer(root);
int level = 0;
while (!nowLevel.isEmpty() || !nextLevel.isEmpty()) {
// 将下一层节点全部装入当前层节点中
while (!nextLevel.isEmpty())
nowLevel.offer(nextLevel.poll());
level++;
// 遍历当前层节点,并将其左右孩子节点装入下一层节点中
while (!nowLevel.isEmpty()) {
TreeNode node = nowLevel.poll();
if (node != null) {
if (node.left != null)
nextLevel.offer(node.left);
if (node.right != null)
nextLevel.offer(node.right);
}
}
}
return level;
}
}