代码随想录day12
144.二叉树的前序遍历
//明确递归的函数,结束边界,单层逻辑
void traversal(TreeNode* node, vector<int>& list){if(node == nullptr){return;}list.push_back(node->val);traversal(node->left, list);traversal(node->right, list);}vector<int> preorderTraversal(TreeNode* root) {vector<int> result;traversal(root, result);return result;}
//迭代法
vector<int> preorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> traversal;if(root == nullptr){return result;}traversal.push(root);while(!traversal.empty()){TreeNode* cur = traversal.top();result.push_back(cur->val);traversal.pop();if(cur->right) traversal.push(cur->right);if(cur->left) traversal.push(cur->left);}return result;}
//统一迭代法
vector<int> preorderTraversal(TreeNode* root) {vector<int> result;stack<pair<TreeNode*, bool>> st;if(root == nullptr) return result;st.push(make_pair(root, false));while(!st.empty()){auto node = st.top();st.pop();if(node.second){result.push_back(node.first->val);} else {if(node.first->right) st.push(make_pair(node.first->right, false));if(node.first->left) st.push(make_pair(node.first->left, false));st.push(make_pair(node.first, true));}}return result;}
145.二叉树的后序遍历
void traversal(TreeNode* node, vector<int>& list){if(node == nullptr){return;}traversal(node->left, list);traversal(node->right, list);list.push_back(node->val);}vector<int> postorderTraversal(TreeNode* root) {vector<int> result;traversal(root, result);return result;}
//迭代法 左右中-》中右左-〉中左右
vector<int> postorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> traversal;if(root == nullptr) return result;traversal.push(root);while(!traversal.empty()){TreeNode* cur = traversal.top();result.push_back(cur->val);traversal.pop();if(cur->left) traversal.push(cur->left);if(cur->right) traversal.push(cur->right);}reverse(result.begin(), result.end());return result;}
//统一迭代法
vector<int> postorderTraversal(TreeNode* root) {vector<int> result;stack<pair<TreeNode*,bool>> st;if(root == nullptr) return result;st.push(make_pair(root, false));while(!st.empty()){auto node = st.top();st.pop();if(node.second){result.push_back(node.first->val);}else{st.push(make_pair(node.first, true));if(node.first->right) st.push(make_pair(node.first->right, false));if(node.first->left) st.push(make_pair(node.first->left, false));}}return result;}
94.二叉树的中序遍历
void traversal(TreeNode* node, vector<int>& list){if(node == nullptr){return;}traversal(node->left, list);list.push_back(node->val);traversal(node->right, list);}vector<int> inorderTraversal(TreeNode* root) {vector<int> result;traversal(root, result);return result;}
//迭代法,需理解左中右无法直接处理
vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack<TreeNode*> st;if(root == nullptr) return result;TreeNode* cur = root;while(cur != nullptr || !st.empty()){if(cur != nullptr){st.push(cur);cur = cur->left;}else{cur = st.top();result.push_back(cur->val);st.pop();cur = cur->right;}}return result;}
//统一迭代法
vector<int> inorderTraversal(TreeNode* root) {vector<int> result;stack<pair<TreeNode*, bool>> st;if(root == nullptr) return result;st.push(make_pair(root, false));while(!st.empty()){auto node = st.top();st.pop();if(node.second) {result.push_back(node.first->val);}else{if(node.first->right) st.push(make_pair(node.first->right, false));st.push(make_pair(node.first, true));if(node.first->left) st.push(make_pair(node.first->left, false));}}return result;}
102.二叉树的层序遍历
//广度优先遍历,使用queue的迭代法
vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> result;queue<TreeNode*> qe;if(root == nullptr) return result;qe.push(root);while(!qe.empty()){int sz = qe.size();vector<int> tmp;for(int i = 0; i < sz; i++){auto node = qe.front();qe.pop();tmp.push_back(node->val);if(node->left) qe.push(node->left);if(node->right) qe.push(node->right);}result.push_back(tmp);}return result;}
//递归法
void order(vector<vector<int>>& result, TreeNode* node, int depth){if(node == nullptr) return;if(result.size() == depth) result.push_back(vector<int>());result[depth].push_back(node->val);if(node->left) order(result, node->left, depth+1);if(node->right) order(result, node->right, depth+1);return;}vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> result;order(result, root, 0);return result;}
107.二叉树的层序遍历II
上题结果reverse即可。
199.二叉树的右视图
//保存层序遍历中每层的最后一位
vector<int> rightSideView(TreeNode* root) {vector<int> result;queue<TreeNode*> qe;if(root == nullptr) return result;qe.push(root);while(!qe.empty()){int sz = qe.size();vector<int> tmp;for(int i = 0; i < sz; i++){TreeNode* node = qe.front();qe.pop();tmp.push_back(node->val);if(node->left){qe.push(node->left);}if(node->right) {qe.push(node->right);}}result.push_back(tmp[sz-1]);}return result;}
637.二叉树的层平均值
//计算每层的总和然后除以size即可
vector<double> averageOfLevels(TreeNode* root) {vector<double> result;queue<TreeNode*> qe;if(root == nullptr) return result;qe.push(root);while(!qe.empty()){int sz = qe.size();double tmp = 0;for(int i = 0; i < sz; i++){TreeNode* node = qe.front();qe.pop();tmp += node->val;if(node->left) qe.push(node->left);if(node->right) qe.push(node->right);}double x = tmp/sz;result.push_back(x);}return result;}
429.N叉树的层序遍历
vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> result;queue<Node*> qe;if(root == nullptr) return result;qe.push(root);while(!qe.empty()){int sz = qe.size();vector<int> tmp;for(int i = 0; i < sz; i++){Node* nd = qe.front();qe.pop();tmp.push_back(nd->val);int cd_sz = nd->children.size();for(int j = 0; j < cd_sz; j++){if(nd->children[j]){qe.push(nd->children[j]);}}}result.push_back(tmp);}return result;}
515.在每个树行中找最大值
vector<int> largestValues(TreeNode* root) {vector<int> result;queue<TreeNode*> qe;if(root == nullptr) return result;qe.push(root);while(!qe.empty()){int sz = qe.size();int tmp = qe.front()->val;for(int i = 0; i < sz; i++){TreeNode* node = qe.front();qe.pop();if(node->val > tmp) tmp = node->val;if(node->left) qe.push(node->left);if(node->right) qe.push(node->right);}result.push_back(tmp);} return result;}
116.填充每个节点的下一个右侧节点指针
117.填充每个节点的下一个右侧节点指针II 同解
Node* connect(Node* root) {queue<Node*> qe;if(root == nullptr) return root;qe.push(root);while(!qe.empty()){int sz = qe.size();for(int i = 0; i < sz; i++){Node* nd = qe.front();qe.pop();if(i == sz - 1){nd->next = nullptr;}else{nd->next = qe.front();}if(nd->left) qe.push(nd->left);if(nd->right) qe.push(nd->right); }}return root;}
104.二叉树的最大深度
int maxDepth(TreeNode* root) {int result = 0;queue<TreeNode*> qe;if(root == nullptr) return result;qe.push(root);while(!qe.empty()){int sz = qe.size();for(int i = 0; i < sz; i++){TreeNode* nd = qe.front();qe.pop();if(nd->left) qe.push(nd->left);if(nd->right) qe.push(nd->right);}result += 1;}return result;}
111.二叉树的最小深度
int minDepth(TreeNode* root) {int result = 0;queue<TreeNode*> qe;if(root == nullptr) return result;qe.push(root);while(!qe.empty()){int sz = qe.size();result += 1;for(int i = 0; i < sz; i++){TreeNode* nd = qe.front();qe.pop();if(!nd->left && !nd->right) return result;if(nd->left) qe.push(nd->left);if(nd->right) qe.push(nd->right);}}return result;}
最近几天有点事,拖了进度,后序需坚持跟上,加油
相关文章:
代码随想录day12
144.二叉树的前序遍历 //明确递归的函数,结束边界,单层逻辑 void traversal(TreeNode* node, vector<int>& list){if(node nullptr){return;}list.push_back(node->val);traversal(node->left, list);traversal(node->right, list)…...
langchain学习笔记之消息存储在内存中的实现方法
langchain学习笔记之消息存储在内存中的实现方法 引言背景消息存储在内存的实现方法消息完整存储:完整代码 引言 本节将介绍 langchain \text{langchain} langchain将历史消息存储在内存中的实现方法。 背景 在与大模型交互过程中,经常出现消息管理方…...
布隆过滤器(简单介绍)
布隆过滤器(Bloom Filter) 是一种高效的概率型数据结构,用于快速判断一个元素是否可能存在于某个集合中。它的核心特点是空间效率极高,但存在一定的误判率(可能误报存在,但不会漏报)。 核心原理…...
Qt中基于开源库QRencode生成二维码(附工程源码链接)
目录 1.QRencode简介 2.编译qrencode 3.在Qt中直接使用QRencode源码 3.1.添加源码 3.2.用字符串生成二维码 3.3.用二进制数据生成二维码 3.4.界面设计 3.5.效果展示 4.注意事项 5.源码下载 1.QRencode简介 QRencode是一个开源的库,专门用于生成二维码&…...
SpringBoot教程(三十二) SpringBoot集成Skywalking链路跟踪
SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪 一、Skywalking是什么?二、Skywalking与JDK版本的对应关系三、Skywalking下载四、Skywalking 数据存储五、Skywalking 的启动六、部署探针 前提: Agents 8.9.0 放入 …...
IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)
IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini) 📊 引言 近年来,AI 编程助手已成为开发者的高效工具,它们可以加速代码编写、优化代码结构,并提供智能提示。本文介绍如何在 IntelliJ I…...
【机器学习】深入浅出KNN算法:原理解析与实践案例分享
在机器学习中,K-最近邻算法(K-Nearest Neighbors, KNN)是一种既直观又实用的算法。它既可以用于分类,也可以用于回归任务。本文将简单介绍KNN算法的基本原理、优缺点以及常见应用场景,并通过一个简单案例帮助大家快速入…...
vscode的一些实用操作
1. 焦点切换(比如主要用到使用快捷键在编辑区和终端区进行切换操作) 2. 跳转行号 使用ctrl g,然后输入指定的文件内容,即可跳转到相应位置。 使用ctrl p,然后输入指定的行号,回车即可跳转到相应行号位置。...
JavaEE基础 Tomcat与Http (下)
目录 1.HTTP 协议 1.1 HTTP 协议概念 1.2. 无状态协议 1.3. HTTP1.0 和 HTTP1.1 1.4 请求协议和响应协议 编辑 1.5 请求协议 1.5.1 常见的请求协议 1.5.2 GET 请求 1.5.3 POST请求 1.5.4 响应协议 1.HTTP 协议 Http浏览器访问东西都是遵循的Http协议。 1.1 HTTP 协议…...
【Linux】【进程】epoll内核实现总结+ET和LT模式内核实现方式
【Linux】【网络】epoll内核实现总结ET和LT模式内核实现方式 1.epoll的工作原理 eventpoll结构 当某一进程调用epoll_create方法时,Linux内核会创建一个eventpoll结构体,这个结构体中有两个成员与epoll的使用方式密切相关. struct eventpoll{..../*红…...
英码科技基于昇腾算力实现DeepSeek离线部署
DeepSeek-R1 模型以其创新架构和高效能技术迅速成为行业焦点。如果能够在边缘进行离线部署,不仅能发挥DeepSeek大模型的效果,还能确保数据处理的安全性和可控性。 英码科技作为AI算力产品和AI应用解决方案服务商,积极响应市场需求࿰…...
测试常见问题汇总-检查表(持续完善)
WEB页面常见的问题 按钮功能的实现:返回按钮是否可以正常返回 信息保存提交后,系统是否给出“成功”的提示信息,列表数据是否自动刷新 没有勾选任何记录直接点【删除】,是否给出“请先选择记录”的提示 删除是否有删除确认框 …...
【SQL】SQL约束
🎄约束 📢作用:是用于限制存储再表中的数据。可以再创建表/修改表时添加约束。 📢目的:保证数据库中数据的正确、有效性和完整性。 📢对于一个字段可以同时添加多个约束。 🎄常用约束: 约束分类 约束 描述关键字非…...
解决 `pip is configured with locations that require TLS/SSL` 错误
问题描述 在使用 pip 安装 Python 包时,可能会遇到以下错误: WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.这意味着 Python 的 ssl 模块未正确安装或配置,导致 p…...
如何commit后更新.gitignore实现push
目录 步骤 1: 更新 .gitignore 文件 步骤 2: 移除已追踪的大文件 步骤 3: 提交更改 步骤 4: 尝试推送 注意事项 如果已经执行了git commit,但后来意识到需要更新.gitignore文件以排除某些不应该被追踪的大文件或目录,并希望在不丢失现有提交记录的情…...
Python 面向对象的三大特征
前言:本篇讲解面向对象的三大特征(封装,继承,多态),还有比较细致的(类属性类方法,静态方法),分步骤讲解,比较适合理清楚三大特征的思路 面向对象的…...
机器学习_18 K均值聚类知识点总结
K均值聚类(K-means Clustering)是一种经典的无监督学习算法,广泛应用于数据分组、模式识别和降维等领域。它通过将数据划分为K个簇,使得簇内相似度高而簇间相似度低。今天,我们就来深入探讨K均值聚类的原理、实现和应用…...
从低清到4K的魔法:FlashVideo突破高分辨率视频生成计算瓶颈(港大港中文字节)
论文链接:https://arxiv.org/pdf/2502.05179 项目链接:https://github.com/FoundationVision/FlashVideo 亮点直击 提出了 FlashVideo,一种将视频生成解耦为两个目标的方法:提示匹配度和视觉质量。通过在两个阶段分别调整模型规模…...
Nuclei 使用手册
Nuclei 是一个开源的快速、高效的漏洞扫描工具,主要用于网络安全领域的漏洞检测。它由 go 语言开发,设计目的是为了高效地扫描 Web 应用程序、网络服务等目标,帮助安全研究人员、渗透测试人员以及红队成员发现潜在的漏洞。 下载链接…...
python学opencv|读取图像(六十七)使用cv2.convexHull()函数实现图像轮廓凸包标注
【1】引言 前序学习进程中,已经初步探索了对图像轮廓的矩形标注和圆形标注: python学opencv|读取图像(六十五)使用cv2.boundingRect()函数实现图像轮廓矩形标注-CSDN博客 但实际上,这两种标注方法都是大致的&#x…...
基于SpringBoot的“高校创新创业课程体系”的设计与实现(源码+数据库+文档+PPT)
基于SpringBoot的“高校创新创业课程体系”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 系统整体功能图 系统首页界面 个人中心界…...
前端带样式导出excel表格,html表格生成带样式的excel表格
众所周知,前端生成表格通常是用xlsx、excel.js等js库,但这些库想要生成时增加excel样式会很麻烦。 有这么一个js库把html表格连样式带数据一并导出为excel表格: html-table-to-excel npm install html-table-to-excel 使用 html表格: <…...
人形机器人 - 仿生机器人核心技术与大小脑
以下是针对仿生机器人核心技术的结构化总结,涵盖通用核心技术与**“大脑-小脑”专用架构**两大方向: 一、机器人通用核心技术 这些技术是仿生机器人实现功能的基础,与生物体的“身体能力”对应: 1. 感知与交互技术 多模态传感器融合 视觉:3D视觉(如RGB-D相机)、动态目…...
【Linux】【网络】Libevent 内核实现简略版
【Linux】【网络】Libevent 内核实现简略版 1 event_base结构–>相当于Reactor 在使用libevent之前,就必须先创建这个结构。 以epoll为例: 1.1evbase void* evbase-->epollop结构体(以epoll为例) libevent通过一个void…...
大数据学习(49) - Flink按键分区状态(Keyed State)
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博主哦ᾑ…...
架构——LVS负载均衡主要模式及其原理、服务水平、优缺点
LVS(Linux Virtual Server)是一款高性能的开源负载均衡软件,支持多种负载均衡模式。以下是其主要模式及其原理、服务水平、优缺点: 1. NAT 模式(Network Address Translation) 原理: 请求流程…...
【React组件通讯双重视角】函数式 vs 类式开发指南
目录 前言 正文 父组件向子组件传值 函数式写法 类式写法 子组件向父组件传值 函数式写法 类式写法 兄弟组件通信 函数式写法 类式写法 跨层级通信(使用Context) 函数式写法 类式写法 进阶通讯方式(补充说明…...
VScode内接入deepseek包过程(本地部署版包会)
目录 1. 首先得有vscode软件 2. 在我们的电脑本地已经部署了ollama,我将以qwen作为实验例子 3. 在vscode上的扩展商店下载continue 4. 下载完成后,依次点击添加模型 5. 在这里可以添加,各种各样的模型,选择我们的ollama 6. 选…...
Ubuntu虚拟机NDK编译ffmpeg
目录 一、ffmpeg源码下载1、安装git(用于下载ffmpeg源码)2、创建源码目录,下载ffmpeg源码 二、下载ubuntu对应的NDK,并解压到opt下1、下载并解压2、配置 ~/.bashrc 三、源码编译、1、创建编译脚本2、脚本文件内容3、设置可执行权限并运行4、编译的结果在…...
机器学习:k近邻
所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。 K 邻近算法(K-Nearest Neighbors,简称 KNN)是一种经典的机器学习算法,主要用于分类和回归任务…...
