文章目录
题目:LeetCode:104.二叉树的最大深度
给定一个二叉树 root ,返回其最大深度。
二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:3
示例 2:
输入:root = [1,null,2]
输出:2
题解
思路一:深度优先搜索(树的前序遍历)
如果只有一个节点 3,节点 3 没有左右子树,那么这颗二叉树的最大深度为 1
如果节点 3 有左子树,没有右子树,那么这颗二叉树的最大深度为:1 + 其左子树的最大深度
如果节点 3 有右子树,没有左子树,那么这颗二叉树的最大深度为:1 + 其右子树的最大深度
如果节点 3有左右子树,那么这颗二叉树的最大深度为:1 + 其左右子树中最大的深度
同理,来看以节点 20 为根节点的树,当其有左子树,没有右子树时,其最大深度可以表示为:1 + 其左子树的最大深度
以节点 20 为根节点的树,当其没有左子树,有右子树时,其最大深度可以表示为:1 + 其右子树的最大深度
以节点 20 为根节点的树,当其有左子树和右子树时,其最大深度可以表示为:1 + 其左右子树中最大的深度
从上述过程中我们可以看到,这颗二叉树的最大深度可以表示为:1 + max(leftDepth, rightDepth),所以可以考虑使用递归求解。这过程中会先访问根节点,如果根节点为 null 则返回 0 ,这是递归的终止条件,而根节点不为空时,会再递归的求解其左右子树的最大深度,递归结束后最终返回 1 + 其左右子树中最大的深度 这便是该二叉树的最大深度。
深度优先搜索 Java 代码实现
使用深度优先搜索解决二叉树的最大深度问题的 Java 代码如下所示:
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return 1 + Math.max(leftDepth, rightDepth);
}
思路二:广度优先搜索(树的层序遍历)
树的最大层次也是树的最大深度。
我们可以用变量 res 来记录树的层数,用变量 size 来记录层序遍历过程中树各层元素的个数。
在进行树的层序遍历时,将树的各层元素依次入队和出队,当树中某层元素都已经出队时,size 变为 0,说明该层元素已经遍历完,让 res 加 1,表示树的层次加 1,当全部元素遍历完后,res 便是树的最大层次。
示例过程如下所示:
节点 3 入队列,size 变为 1,表示当前层的元素个数为 1
节点 3 出队列,节点 3 的左孩子节点 9 和右孩子节点 20 入队列,此时 size 变为 0,说明第 1 层元素已遍历完,res 加 1 ,表示层次加 1
节点 9 出队列,节点 9 没有左右孩子节点,无新节点入队,size 变为 1,说明该层还有 1 个元素没遍历完
节点 20 出队列,节点 20 的左孩子节点 15 和右孩子节点 7 入队列,size 变为 0,说明第 2 层元素已遍历完,res 加 1 ,表示层次加 1
节点 15 出队列,节点 15 没有左右孩子节点,无新节点入队,size 变为 1,说明该层还有 1 个元素没遍历完
节点 7 出队列,节点 7 没有左右孩子节点,无新节点入队,size 变为 0,说明第 3 层元素已遍历完,res 加 1 ,表示层次加 1
此时队列为空表示树中节点已经遍历完,res = 3 说明这颗二叉树的最大深度为 3
广度优先搜索 Java 代码实现
使用广度优先搜索解决二叉树的最大深度问题的 Java 代码如下所示:
public int maxDepth(TreeNode root) {
if(root == null){
return 0;
}
int res = 0;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
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--;
}
res++;
}
return res;
}
总结
本文通过深度优先搜索和广度优先搜索两种方式解决了 LeetCode:104.二叉树的最大深度问题。使用深度优先搜索解决时,要能够分析出问题的递归结构特征,而使用广度优先搜索解决时,要能够想清楚如何在遍历时将树的层次记录下来。