leetcodeHot100 | 104.二叉树的最大深度

这里依旧是一个老的系列,好久没有更新笔记了,所以想着要写一写了。最近一直在测试AI相关的一些游戏,每天感觉时间都排满了。现在吧算法重新捡起来,这个阶段依旧是打基础,把所有东西一次性学会还是比较困难的。算法中其中一个比较难的点就是对于题目的理解,题目以及对于的解法如何这也是一个问题。在考验的时候,我看一个学长发的视频说:"你们这些人背政治题不要只是背答案啊,要把题目和答案对应上,到时候背了你瞎写。"

104.二叉树的最大深度

给定一个二叉树root,返回其最大深度。

二叉树的深度是指从根节点到最远叶子节点的最长路径上面的节点数。

思路分析

关于这一题有两种解法,两种都是需要会的,一种是层序便利,还有一种是后续便利。先来看层序便利的思路:

树的层序遍历/ 广度优先搜索 往往需要维护一个队列。每便利一层计数器需要+1,直到遍历完成,就可以得到树的深度。来看实际的算法怎么写。

cpp 复制代码
class Solution {

public:

    int maxDepth(TreeNode* root) {

        if(root == nullptr) return 0; // 首先不能是空指针

        vector<TreeNode*> que; // 维护一个队列

        que.push_back(root); // 进队

        int res = 0; // 维护一个计数器

        while (!que.empty()) {

            vector<TreeNode*> tmp;// 维护一个节点变量

            for(TreeNode* node : que) {// 便利当前层的所有节点如果有左孩子加入下一层队列,如果有右孩子也加入下一层队列。

                if(node -> left != nullptr) tmp.push_back(node->left);

                if(node->right != nullptr) tmp.push_back(node->right);

            }
			// 把队列更新为下一层节点。
            que = tmp;

            res++;

        }

        return res;

    }

};

看完题解后的问题

1.如何知道自己遍历完这一次了?->只要还有层没有便利完就继续。

还有就是root,接受到root之后可以通过root找到其他节点。

2.怎么知道自己在哪一层?-> 也就是while每次问还有楼层没打扫吗,而for循环就是每次只处理当前的楼层。

3.那tmp又是如何拿到当前的层的呢?->理解错误不是拿到,而是先来一个容器准备"生出来一个新的楼层"tmp是正在盖的下一层楼。而for循环就是生孩子,也就是创造下一层的意思。

cpp 复制代码
while (!que.empty()) { 
	vector<TreeNode*> tmp; // 👈 一开始是空的! 
	// 👇 核心:遍历【当前层】的每一个节点 
	for(TreeNode* node : que) { // 每个节点都把自己的【左孩子】放进 tmp 
		if(node->left) tmp.push_back(node->left); // 每个节点都把自己的【右孩子】放进 tmp 
		if(node->right) tmp.push_back(node->right); 
	} // 👆 循环结束 
	// tmp 就装满了:当前层所有节点的孩子 
	// 这些孩子 = 下一层! 
	que = tmp; // 下一层变成新的当前层 
	res++; // 楼层+1 
}

后序便利

这种解法也需要掌握

cpp 复制代码
class Solution {

public:

    int maxDepth(TreeNode* root) {

        if(root == nullptr) return 0;

        return max(maxDepth(root ->left), maxDepth(root->right)) + 1;

    }

};
相关推荐
SamDeepThinking5 小时前
高并发场景下,CompletableFuture与ForkJoinPool该如何取舍?
java·后端·面试
LiuMingXin6 小时前
意图与代码之间:AI编程范式全景解读
前端·后端·面试
以和为贵8 小时前
前端也能搞懂 RAG:用 JS 手写一条最小检索增强链路
前端·人工智能·面试
半个落月12 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
Darling噜啦啦12 小时前
快速排序与递归思维:从分治策略到数组扁平化——面试必考算法全解析
面试·排序算法
小月土星13 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
沉默王二13 小时前
Agent底层原理连问8道,从ReAct到记忆压缩,PaiCLI项目实战拆解
面试·agent·ai编程
小月土星13 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
蝎子莱莱爱打怪13 小时前
XZLL-IM干货系列 04|Netty 长连接实战:Pipeline 怎么排、心跳怎么跳、连接怎么管
后端·微服务·面试
kyriewen1 天前
别再 console.log 了:5 个 Chrome DevTools 调试技巧,用过就回不去了
前端·javascript·面试