力扣|力扣 - 剑指 Offer 55 - I. 二叉树的深度
题目
【力扣|力扣 - 剑指 Offer 55 - I. 二叉树的深度】剑指 Offer 55 - I. 二叉树的深度
思路1(DFS)
- 后续遍历吧,先遍历到最深(递归到末尾返回0),然后从后面一步一步比较取大的值返回,每次返回层数都加1,
- 执行流程是怎样的:比如其中一个节点左子树为空,右子树有一个叶子节点,那么 0 > 1 ,肯定选 1 ,再加上当前一层 1 ,返回 2 给父节点;然后到了父节点对两个子节点的比较,其中一个节点就是刚才的 2 ,如果另一个返回的深度为4,那么就取 4 ,再加上当前的 1 返回 5 给它的父节点……直到返回到根节点,此时就得到了二叉树的最大深度
class Solution {
public int maxDepth(TreeNode root) {
return dfs(root);
}public int dfs(TreeNode root) {
if (root == null) {
return 0;
}// 获取左子树和右子树的深度
int l = dfs(root.left);
int r = dfs(root.right);
// 取其中较大的一个深度,并且加上当前一层 1 传递给父节点
return Math.max(l, r) + 1;
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(N)\)
- BFS/广度优先遍历,即层序遍历,这种可能会更好理解一点,这种解法思路就是每次遍历一层,层数
res
就加 1,直到遍历到最后一层,此时res
就是二叉树的最大深度了 - 使用队列存储节点,每次循环先计算队列中有几个节点(就是每层的节点个数),然后将这些节点一次性出队,同时还要判断出队的节点是否有子节点,如果有就入队,这就算完成了一层的遍历……直到遍历到最后一层
class Solution {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}int res = 0;
Queue queue = new LinkedList<>();
queue.offer(root);
// 层序遍历/广度优先遍历/BFS
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--;
}
// 每遍历一层,层数加 1
res++;
}return res;
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(N)\),最差情况下(当树平衡时),队列
queue
同时存储 \(N/2\) 个节点。
推荐阅读
- 剑指|剑指 Offer 13. 机器人的运动范围(dfs,bfs)
- 数据结构与算法|【算法】力扣第 266场周赛
- leetcode|今天开始记录自己的力扣之路
- 剑指offer60.n个骰子的点数
- 剑指offer——最小的K个数
- Android|年后备战金三银四(Android面试吃透这一篇就没有拿不到的offer......)
- 剑指黄昏
- 剑指offer15.二进制中1的个数
- java|阿里工作8年,肝到P8就剩这份学习笔记了,已助朋友拿到10个Offer
- 字节前端面试经验(已拿到offer)