代码随想录第十一天|二叉树的遍历方式

. - 力扣(LeetCode). - 力扣(LeetCode). - 力扣(LeetCode)

思路:递归遍历

class Solution {
public:vector<int> res;void preOrder(TreeNode* root){if(root!=NULL){res.push_back(root->val);preOrder(root->left);preOrder(root->right);}}void inOrder(TreeNode* root){if(root!=NULL){res.push_back(root->val);inOrder(root->left);inOrder(root->right);}}void postOrder(TreeNode* root){if(root!=NULL){res.push_back(root->val);postOrder(root->left);preOrder(root->right);}}vector<int> preorderTraversal(TreeNode* root) {preOrder(root);return res;}
};

迭代遍历

class Solution {
public:vector<int> res;void preOrder(TreeNode* root) {if (root == nullptr) return; // 处理空节点stack<TreeNode*> s;s.push(root);while (!s.empty()) {TreeNode *now = s.top();s.pop();  // 这里应该先弹出栈顶元素// 将当前结点插入结果res.push_back(now->val);// 先将右子节点压入栈,因为后入先出原则if (now->right != nullptr) {s.push(now->right);}// 再将左子节点压入栈if (now->left != nullptr) {s.push(now->left);}}}vector<int> preorderTraversal(TreeNode* root) {preOrder(root);return res;}
};
class Solution {
public:vector<int> res;void inOrder(TreeNode* root){TreeNode *cur=root;stack<TreeNode*> s;if(root==NULL) return;while(cur!=NULL||!s.empty()){if(cur!=NULL){s.push(cur);cur=cur->left;//左}//现在栈顶为最左边元素 应该访问else{cur=s.top();res.push_back(cur->val);//中s.pop();cur=cur->right;}}}vector<int> inorderTraversal(TreeNode* root) {inOrder(root);return res;}
};
class Solution {
public:vector<int> res;void postOrder(TreeNode* root) {stack<TreeNode*> s;if (root == nullptr) return;s.push(root);while (!s.empty()) {TreeNode* now = s.top();res.push_back(now->val);s.pop();// 先将左子节点压入栈,因为我们逆序遍历if (now->left != nullptr) {s.push(now->left);}// 再将右子节点压入栈if (now->right != nullptr) {s.push(now->right);}}}vector<int> postorderTraversal(TreeNode* root) {postOrder(root);// 反转结果得到正确的后序遍历reverse(res.begin(), res.end());return res;}
};

统一风格迭代法不好理解

二叉树的层序遍历

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> v;if (root == nullptr) return v;  // 根节点为空时,返回空结果queue<TreeNode*> q;q.push(root);while (!q.empty()) {int layerSize = q.size();  // 当前层的节点数量vector<int> currentLayer;  // 存储当前层的节点值for (int i = 0; i < layerSize; i++) {TreeNode* now = q.front();q.pop();currentLayer.push_back(now->val);  // 将节点值加入当前层if (now->left != nullptr) {q.push(now->left);  // 左子节点入队}if (now->right != nullptr) {q.push(now->right);  // 右子节点入队}}v.push_back(currentLayer);  // 将当前层加入结果}return v;}
};
class Solution {
public:vector<vector<int>> levelOrderBottom(TreeNode* root) {queue<TreeNode*> q;vector<vector<int>> res;stack<vector<int>> r;if(root==NULL) return res;q.push(root);while(!q.empty()){int size=q.size();vector<int> now;for(int i=0;i<size;i++){TreeNode *node=q.front();q.pop();now.push_back(node->val);if(node->left!=NULL) q.push(node->left);if(node->right!=NULL) q.push(node->right);}r.push(now);}while(!r.empty()){vector<int> now=r.top();r.pop();res.push_back(now);}return res;}
};
class Solution {
public:vector<int> rightSideView(TreeNode* root) {queue<TreeNode*> q;vector<int> res;if(root==NULL) return res;q.push(root);while(!q.empty()){int size=q.size();vector<int> now;for(int i=0;i<size;i++){TreeNode *node=q.front();q.pop();if(i==size-1)res.push_back(node->val);if(node->left!=NULL) q.push(node->left);if(node->right!=NULL) q.push(node->right);}}return res;}
};
class Solution {
public:vector<double> averageOfLevels(TreeNode* root) {queue<TreeNode*> q;vector<vector<int>> res;vector<double> r;if(root==NULL) return r;q.push(root);while(!q.empty()){int size=q.size();vector<int> now;for(int i=0;i<size;i++){TreeNode *node=q.front();q.pop();now.push_back(node->val);if(node->left!=NULL) q.push(node->left);if(node->right!=NULL) q.push(node->right);}res.push_back(now);}for(vector<int> nums:res){double sum=0;for(int num:nums){sum+=(double)num;}sum/=nums.size();r.push_back(sum);}return r;}
};
class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> v;if (root == nullptr) return v;  // 根节点为空时,返回空结果queue<Node*> q;q.push(root);while (!q.empty()) {int layerSize = q.size();  // 当前层的节点数量vector<int> currentLayer;  // 存储当前层的节点值for (int i = 0; i < layerSize; i++) {Node* now = q.front();q.pop();currentLayer.push_back(now->val);  // 将节点值加入当前层for(Node *node:now->children){if(node!=NULL)q.push(node);}}v.push_back(currentLayer);  // 将当前层加入结果}return v;}
};
class Solution {
public:Node* connect(Node* root) {if (root == nullptr) return root;  // 根节点为空时,返回空结果queue<Node*> q;q.push(root);while (!q.empty()) {int layerSize = q.size();  // 当前层的节点数量Node* pre = nullptr;  // 前一个节点初始化为空for (int i = 0; i < layerSize; i++) {  // 注意循环从0开始Node* now = q.front();q.pop();if (pre != nullptr) {pre->next = now;  // 前一个节点的next指向当前节点}pre = now;  // 更新前一个节点为当前节点if (now->left != nullptr) {q.push(now->left);  // 左子节点入队}if (now->right != nullptr) {q.push(now->right);  // 右子节点入队}}// 最后一个节点的next指向nullpre->next = nullptr;}return root;}
};
class Solution {
public:int dfs(int dep,TreeNode *now){if(now==NULL){return dep;}else{int dep1 = dep, dep2 = dep;if(now->left!=NULL){dep1=dfs(dep+1,now->left);}if(now->right!=NULL){dep2=dfs(dep+1,now->right);}return max(dep1,dep2);}}int maxDepth(TreeNode* root) {if(root==NULL)return 0;return dfs(1,root);}
};
class Solution {
public:
int dfs(int dep,TreeNode *now){if(now==NULL)return INT_MAX;// 如果当前节点是叶子节点,直接返回当前深度if (now->left == NULL && now->right == NULL) {return dep;}// 递归计算左右子树的最小深度int dep1 = dfs(dep + 1, now->left);int dep2 = dfs(dep + 1, now->right);return min(dep1, dep2);  // 返回左右子树中较小的深度}int minDepth(TreeNode* root) {if(root==NULL)return 0;return dfs(1,root);}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/419321.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

银行结算业务

1.1 银行本票 银行本票是由银行签发的,承诺自己在见票时无条件支付票款给收款人或持票人的业务。银行本票按票面划分为定额本票和不定额本票,按币种划分为人民币银行本票和外币银行本票。人民币银行本票仅在同一交换区域内使用,资金清算利用当地人民银行组织的资金清算形式…

多个vue项目部署到nginx服务器

文章目录 需求一、项目打包1.vue.config.js2.request.js文件3.打包 二、nginx配置 需求 同一个域名安装多个vue项目。 比如&#xff1a;域名为 https://domain.com 后缀。那么通过不同的后缀就能去访问不同的项目地址。 https://domain.com&#xff0c;不加任何后缀&#x…

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中&#xff0c;若想了解全部题解整理&#xff0c;请看这里&#xff1a; 第0006页 寻找重复数 今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一&#xff0c;是道好题&#xff0c;不过我们还是得先理解了它才…

微信小程序中如何监听元素进入目标元素

Page({onLoad: function(){// 如果目标节点&#xff08;用选择器 .target-class 指定&#xff09;进入显示区域以下 100px 时&#xff0c;就会触发回调函数。wx.createIntersectionObserver().relativeToViewport({bottom: 100}).observe(.target-class, (res) > {res.inter…

合宙4G模组Air780EX——产品规格书

Air780EX 是合宙通信推出的LTE Cat.1 bis通信模块&#xff1b; Air780EX采用移芯EC618平台&#xff0c;支持LTE 3GPP Rel.13 技术&#xff1b; Air780EX 是4G全网通模块&#xff0c;可适应不同的运营商和产品&#xff0c;确保产品设计的最大灵活性。 其主要特点和优势可以总…

maven配置文件常用模板

注释很详细&#xff0c;直接上代码 项目结构 内容 父项目 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi…

高德地图SDK Android版开发 10 InfoWindow

高德地图SDK Android版开发 10 InfoWindow 前言相关类和方法默认样式Marker类AMap类AMap.OnInfoWindowClickListener 接口 自定义样式(视图)AMap 类AMap.ImageInfoWindowAdapter 接口 自定义样式(Image)AMap.ImageInfoWindowAdapter 接口 示例界面布局MapInfoWindow类常量成员变…

【数学建模国赛思路预约】2024全国大学生数学建模竞赛助攻思路、代码、论文

2024年全国大学生数学建模大赛马上就要开始了&#xff0c;大家有没有准备好呢&#xff0c;今年将会和之前一样&#xff0c;将会在比赛赛中时期为大家提供比赛各题的相关解题思路、可运行代码参考以及成品论文。 一、分享计划表如下所示 1、 赛中分享内容包括&#xff08;2023国…

高并发内存池(二):​整体框架的介绍与ThreadCache的实现

目录 整体框架介绍 ThreadCache的主体框架 自由链表-FreeList 内存对齐-RoundUp 计算桶位置-Index 基础版 进阶版 线程局部存储 __declspec(thread) 关键字 实现线程无锁 申请内存-Allocate 释放内存-Deallocate 从中心缓存中申请内存 整体框架介绍 高并发内存池…

机器学习引领未来:赋能精准高效的图像识别技术革新

图像识别技术近年来取得了显著进展,深刻地改变了各行各业。机器学习,特别是深度学习的突破,推动了这一领域的技术革新。本文将深入探讨机器学习如何赋能图像识别技术,从基础理论到前沿进展,再到实际应用与挑战展望,为您全面呈现这一领域的最新动态和未来趋势。 1. 引言 …

kubernetes集群部署Confluence 7.2.0+mysql 5.7(自测有效)

背景介绍&#xff1a; Confluence是一个专业的企业知识管理与协同软件。使用简单&#xff0c;但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论&#xff0c;信息推送。 这里介绍的使用的是Confluence 7.2.0版本的。 一、在kubernetes集群部署 1…

本地零阶提示优化

本文探讨了如何优化大型语言模型&#xff08;LLM&#xff09;中的提示&#xff08;prompt&#xff09;&#xff0c;以更有效地利用这些黑盒模型的能力。传统的优化方法倾向于寻找全局最优解&#xff0c;但在某些情况下这种做法可能表现不佳。通过对提示优化进行深入的研究&…

01 Docker概念和部署

目录 1.1 Docker 概述 1.1.1 Docker 的优势 1.1.2 镜像 1.1.3 容器 1.1.4 仓库 1.2 安装 Docker 1.2.1 配置和安装依赖环境 1.3镜像操作 1.3.1 搜索镜像 1.3.2 获取镜像 1.3.3 查看镜像 1.3.4 给镜像重命名 1.3.5 存储&#xff0c;载入镜像和删除镜像 1.4 Doecker…

汽车功能安全--TC3xx之PBIST、MONBIST

目录 1.PMS 电源监控速览 2.PBIST 3.MONBIST 4.小结 1.PMS 电源监控速览 英飞凌TC3xx芯片的四种硬件机制&#xff0c;分别是&#xff1a; PMS:PBIST: Power Built-in Self Test. MCU:LBIST: Logic Built-in Self Test. PMS:MONBIST: Monitor Built-in Self Test. VMT:MBI…

史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!

command &#xff1a;命令名&#xff0c;相应功能的英文单词或单词的缩写[-options] &#xff1a;选项&#xff0c;可用来对命令进行控制&#xff0c;也可以省略parameter &#xff1a;传给命令的参数&#xff0c;可以是 零个、一个 或者 多个 查阅命令帮助信息 -help 说明&…

【高阶数据结构】B树、B+树、B*树

B树、B树、B*树 1. 常见的搜索结构2. B树概念3. B树的插入分析4. B树的插入实现4.1 B树的节点设计4.2 B树的部分插入实现14.3 B树的查找4.4 B树的部分插入实现24.5 插入key的过程4.7 B树的插入完整代码4.8 B树的简单验证4.9 B树的删除4.10 B树的性能分析 5. B树6. B*树7. 总结8…

【C++】STL学习——list模拟实现

目录 list介绍list结构介绍节点类的实现迭代器的实现构造函数运算符重载--运算符重载运算符重载!运算符重载*运算符重载->运算符重载 const迭代器的实现多参数模板迭代器list函数接口总览默认成员函数构造函数1构造函数2构造函数3 析构函数拷贝构造函数赋值重载函数 迭代器b…

开放式系统互连(OSI)模型的实际意义

0 前言 开放式系统互连&#xff08;OSI&#xff0c;Open Systems Interconnection&#xff09;模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;目的是为了促进不同厂商生产的网络设备之间的互操作性。 定义了一种在层之间进行协议实现…

【C++】STL容器详解【下】

目录 一、list容器 1.1 list基本概念 1.2 lsit构造函数 1.3 list数据元素插入和删除操作 1.4 list大小操作 1.5 list赋值操作 1.6 list数据的存取 1.7 list反转排序 二、set/multiset容器 2.1 set/multiset基本概念 2.2 set构造函数 2.3 set赋值操作 2.4 set大小操…

数据库的操作:SQL语言的介绍

一.前言 SQL是一种结构化查询语言。关系型数据库中进行操作的标准语言。 二.特点 ①对大小写不敏感 例如&#xff1a;select与Select是一样的 ②结尾要使用分号 没有分号认为还没结束; 三.分类 ①DDL&#xff1a;数据定义语言&#xff08;数据库对象的操作&#xff08;结…