代码随想录算法训练营第24天(补第12天)| 递归遍历,迭代遍历,统一迭代

news/2024/10/24 20:19:20/文章来源:https://www.cnblogs.com/VickyWu/p/18500379

前置知识

二叉树的定义:

struct BNode{int val;BNode* lchild;BNode* rchild;BNode():lchild(NULL),rchild(NULL){}BNode(int val){val=val;lchild=rchild=NULL;}
};

递归遍历

文章链接:https://programmercarl.com/二叉树的递归遍历.html#思路
题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
https://leetcode.cn/problems/binary-tree-postorder-traversal/description/
https://leetcode.cn/problems/binary-tree-inorder-traversal/description/

前序遍历:

class Solution {
public:void traversal(TreeNode* cur,vector<int>& res){if(cur==NULL) return;res.push_back(cur->val);traversal(cur->left,res);traversal(cur->right,res);}vector<int> preorderTraversal(TreeNode* root) {vector<int> res;traversal(root,res);return res;}
};

后续遍历:

class Solution {
public:void traversal(TreeNode* cur,vector<int>& res){if(cur==NULL) return;traversal(cur->left,res);traversal(cur->right,res);res.push_back(cur->val);}vector<int> postorderTraversal(TreeNode* root) {vector<int> res;traversal(root,res);return res;}
};

中序遍历:

class Solution {
public:void traversal(TreeNode* cur,vector<int>& res){if(cur==NULL) return;traversal(cur->left,res);res.push_back(cur->val);traversal(cur->right,res);}vector<int> inorderTraversal(TreeNode* root) {vector<int> res;traversal(root,res);return res;}
};

迭代遍历

文章链接:https://programmercarl.com/二叉树的迭代遍历.html#算法公开课
题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
https://leetcode.cn/problems/binary-tree-inorder-traversal/description/
https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

前序遍历:

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> res;if(root==NULL) return res;else st.push(root);while(!st.empty()){TreeNode* node=st.top();st.pop();res.push_back(node->val);if(node->right) st.push(node->right);if(node->left) st.push(node->left);}return res;}
};

中序遍历:由于访问顺序和处理顺序不一样,所以会稍微复杂。需要先用指针访问到树的最后一层再进行处理。

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;TreeNode* cur=root;while(cur!=NULL||!st.empty()){//一直遍历到底部再进行处理while(cur!=NULL){st.push(cur);cur=cur->left;//左}//可以开始处理了if(!st.empty()){cur=st.top();  //中st.pop();res.push_back(cur->val);cur=cur->right;  //右}}return res;}
};

后序遍历:
可以按照这个思路写:

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {vector<int> res;stack<TreeNode*> st;if(root==NULL) return res;else st.push(root);while(!st.empty()){TreeNode* node=st.top();st.pop();res.push_back(node->val);if(node->left) st.push(node->left);if(node->right) st.push(node->right);}reverse(res.begin(),res.end());return res;}
};

统一迭代

文章链接:https://programmercarl.com/二叉树的统一迭代法.html
题目链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/description/
https://leetcode.cn/problems/binary-tree-inorder-traversal/description/
https://leetcode.cn/problems/binary-tree-postorder-traversal/description/

要点:使用栈的话,无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。
那我们就将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记。
如何标记呢,就是要处理的节点放入栈之后,紧接着放入一个空指针作为标记。 这种方法也可以叫做标记法

中序:

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> res;if(root!=NULL) st.push(root);while(!st.empty()){TreeNode*node=st.top();//如果所取的头部节点不为空,就弹出if(node!=NULL){st.pop();if(node->right) st.push(node->right); //右st.push(node); //已经弹出的中间节点继续压入  中st.push(NULL); //并添加空节点作为标识if(node->left) st.push(node->left);  //左}else{   //如果node不是空节点,则可取为resst.pop();node=st.top();st.pop();res.push_back(node->val);}}return res;}
};

前序:相比中序,只改变了两行的顺序

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> res;if(root!=NULL) st.push(root);while(!st.empty()){TreeNode* node=st.top();if(node!=NULL){st.pop();if(node->right) st.push(node->right); //右if(node->left) st.push(node->left);   //左st.push(node);   //中st.push(NULL);   //标识}else{st.pop();node=st.top();st.pop();res.push_back(node->val);}}return res;}
};

后序:

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> res;if(root!=NULL) st.push(root);while(!st.empty()){TreeNode* node=st.top();if(node!=NULL){st.push(NULL);  //中if(node->right) st.push(node->right);  //右if(node->left) st.push(node->left);   //左}else{st.pop();node=st.top();st.pop();res.push_back(node->val);}}return res;}
};

层序遍历:

文章链接:https://programmercarl.com/0102.二叉树的层序遍历.html#_102-二叉树的层序遍历
题目链接:https://leetcode.cn/problems/binary-tree-level-order-traversal/

class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {vector<vector<int>> res;queue<TreeNode*> que;int size=0;if(root!=NULL){que.push(root);size++;}while(!que.empty()){vector<int> curRes;int i=0;  //这里我取了i来整体记录size的最终变化。//实际上可以用que的库函数size()来得到当前的元素个数while(size--){TreeNode* node=que.front();que.pop();if(node->left){que.push(node->left);i++;}if(node->right){que.push(node->right);i++;}curRes.push_back(node->val);}size=i;res.push_back(curRes);}return res;}
};

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

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

相关文章

20222403 2024-2025-1 《网络与系统攻防技术》实验三实验报告

1. 实验内容 1.1.实践内容 (1)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免杀工具或技巧正确使用msf编码器,使用msfvenom生成如jar之类的其他文件 veil,加壳工具 使用C + shellcode编程(2)通过组合应用各种技术实现恶意代码免杀 如果成功实现了免杀的,简单语…

Camunda中的Execution listeners和Task listeners

在Camunda中大多数节点元素都可以设置执行监听器(Execution listeners),例如事件、顺序流、用户任务、服务任务和网关。其中用户任务除了可以设置执行监听器,还可以设置独有的用户任务监听器,相比于执行监听器,用户任务监听器可以设置更加细粒度的事件类型。 下面针对执行…

AMD Ryzen 5700X黑苹果运行Docker和Virtualization(虚拟化)

最近把我的AMD Ryzen黑苹果系统升级到Sequoia 15.01 发现virtualbox不能用了,遂重新分区又安装了一个Sonoma 14.7AMD Ryzen Run Virtualization展示 Virtualization Limit系统要求: BigSur <= 当前运行系统版本 <= Sonoma 虚拟化软件: virtualbox 6.1.50 安全要求:关…

GISBox对比CesiumLab,哪款GIS工具箱更适合你?

在地理信息系统(GIS)领域,越来越多的用户开始关注GIS工具箱的选择,其中GISBox和CesiumLab是两款备受推崇的产品。那么,哪一款更适合你的需求呢?本文将从功能、使用体验和应用场景等方面,对GISBox和CesiumLab进行详细对比,帮助你做出更明智的选择。 GISBox:功能强大,简…

一,超级详细的ClickHouse安装部署文档(RPM版安装),新手小白一看就能学会!!!

ClickHouse安装部署博客笔记(RPM版) 前言 ClickHouse是一个高性能的列式数据库,专为在线分析处理(OLAP)而设计。它能够实时生成分析数据报告,并支持对大数据进行快速的查询。本文将带你一步步完成ClickHouse的单机安装部署,确保你能够顺利上手这个强大的数据库系统。 第…

STM32配置HID设备时主机识别不到力反馈的解决办法

这个问题困扰我快一个星期了,我仔仔细细阅读了Device Class Definition for Physical Interface Devices (PID) Version 1.0和HID Usage Tables FOR Universal Serial Bus (USB)。 都没有找到识别不到力反馈的原因,按理说配置完报告描述符就能显示力反馈了,但是我这边死活识…

VSCode Java环境配置

JDK 部分 1. 下载 java jdk jdk23下载地址 windows 选择 Windows / x64 zip 文件 2. 解压 将 zip 文件移动到你想要的路径下并解压,如: E:\openjdk-23.0.1_windows-x64_bin 解压后复制 bin 文件路径,如: E:\openjdk-23.0.1_windows-x64_bin\jdk-23.0.1\bin 3. 配置环境变…

第8课 项目管理工具禅道

一、禅道的介绍 (1)定义禅道是一个项目管理工具,也是一个bug管理工具,还是一个用例管理工具。 (2)作用:为了解决众多企业在管理中出现混乱,无序的现象,开发出来 (3)来源:禅道属易软天创公司 (4 )禅道是集于产品管理,项目管理,测试管理于一身,同时包含事务管理…

支付通道网络(PCN)研究

背景 为了缓解主链吞吐量和交易费用的弊端,支付通道网络的技术被提出。交易的双方节点可以通过智能合约搭建一个支付通道,双方各锁定一定数量的初始资金,进行无限次的链下交易,这些交易不会被发布在区块链上,直到通道关闭,才会最终提交到链上。 PCN的问题多跳支付依赖于中…

23~24 炼石计划 NOIP 练习题部分题解

其实还是不加密码了目录 目录第 1 组JOISC2017 火车旅行IOI2018 会议CF1558F Strange SortAPIO2018 新家CTSC2017 密钥CF1748E Yet Another Array Counting Problem第 2 组NOI2016 区间LOJ552 MIN&MAX IJOISC2023 合唱LOJ542 序列划分LOJ560 Menci 的序列P8978 中位数第 3 …

指令2(不完整)

一、CMP指令MOV EAX,100 MOV ECX,100 CMP EAX,ECX 这个主要是通过观察Z位来判断EAX和ECX两个数相不相等 先用mov将eax和ecx变成100再进行相减,得到eax为0ecx为100,z位为1再将eax改成100,把所有标志寄存器改为0,输入指令CMP EAX,ECX 只有标志寄存器发…

RTE 2024 隐藏攻略

大家好!想必今年 RTE 大会议程大家都了解得差不多了,这将是一场实时互动和多模态 AI builder 的年度大聚会。大会开始前,我们邀请了参与大会策划的 RTE 开发者社区和超音速计划的成员们,分享了不同活动的亮点和隐藏攻略。请收藏好,开启你的 RTE 2024 之旅吧! 大会基本信息…