递归训练一:Leetcode 104.二叉树的最大深度
题目描述
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
原题目链接:https://leetcode-cn.com/problems/maximum-depth-of-binary-tree
题解
这里我需要说一下,做二叉树相关的题,你需要的最少技能是,
1、得知道啥是二叉树
2、掌握二叉树的前中后序遍历 + 层序遍历
如果这些都不懂的,我建议你先去学一学。
解法一:从上到下计算(前序遍历)
1、从根节点开始,每下降一层,就将深度+1
2、用全局变量来记录下最大深度
3、每当达到叶子节点时就与全局变量进行比较和更新
class Solution {
// 全局变量,存放结果
int res = 0;
public int maxDepth(TreeNode root) {
// 深度遍历,一开始的深度为 0
dfs(root, 0);
// 返回结果
return this.res;
}
public void dfs(TreeNode root, int length){
// 如果到达叶子节点,就更新结果
if (root == null){
// 选取最深的叶子节点作为结果
res = Math.max(this.res, length);
return;
}
// 由于当前节点有值,故深度要+1
dfs(root.left, length+1); // 查找左节点
dfs(root.right, length+1); // 查找右节点
}
}
解法二:从下到上计算机(后序遍历)
1、若我们知道两个叶子节点的长度,那么我们就能通过两个叶子的最大深度再+1,得到根节点的最大深度。
2、而这种先知道两个子节点,再知道根节点恰好符合后序遍历的特点,具体看代码
class Solution {
public int maxDepth(TreeNode root) {
// 返回当前节点的最大深度
return dfs(root);
}
public int dfs(TreeNode root){
// 如果是空节点,则深度为 0
if (root == null){
return 0;
}
// 遍历左节点得到左节点的最大深度
int leftLength = dfs(root.left);
// 遍历右节点得到右节点的最大深度
int rightLength = dfs(root.right);
// 返回两个节点的最大深度,再加根节点的深度(+1)
return Math.max(leftLength, rightLength) + 1;
}
}
解法三:层序遍历
1、使用队列来存放节点
2、一开始先知道当前层数的节点个数,然后根据个数出队,并对其孩子节点入队
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) return 0;
// 创建一个队列
Deque<TreeNode> deque = new LinkedList<>();
// 根结点入队列,对应第一层
deque.offer(root);
int res = 0;
// 如果队列不为空
while (!deque.isEmpty()){
// 层数
res += 1;
// 找到当前层的节点数
int length = deque.size();
// 清空当前层,并把孩子节点入队
for (int i=0; i < length; i++){
TreeNode node = deque.pollFirst();
if (node.left != null)
deque.offer(node.left);
if (node.right != null)
deque.offer(node.right);
}
}
return res;
}
}
评论(3)
根节点的深度为0吗
不好意思看错了,没看到 root null这个判断条件
根节点深度为0吗