【高阶数据结构】二叉树的非递归遍历

news2024/11/16 12:06:47

🌈欢迎来到数据结构专栏~~二叉树的非递归遍历


  • (꒪ꇴ꒪(꒪ꇴ꒪ )🐣,我是Scort
  • 目前状态:大三非科班啃C++中
  • 🌍博客主页:张小姐的猫~江湖背景
  • 快上车🚘,握好方向盘跟我有一起打天下嘞!
  • 送给自己的一句鸡汤🤔:
  • 🔥真正的大师永远怀着一颗学徒的心
  • 作者水平很有限,如果发现错误,可在评论区指正,感谢🙏
  • 🎉🎉欢迎持续关注!
    在这里插入图片描述

请添加图片描述

二叉树的非递归遍历

  • 🌈欢迎来到数据结构专栏~~二叉树的非递归遍历
      • 1️⃣二叉树的前序遍历
      • 2️⃣二叉树的中序遍历
      • 3️⃣二叉树的后序遍历
  • 📢写在最后

请添加图片描述

1️⃣二叉树的前序遍历

题目链接:传送

在这里插入图片描述

本文我们都采用非递归的方法去讲解:

本质上是在模拟递归,因为在递归的过程中使用了系统,所以在迭代的解法中常用Stack来模拟系统栈

思路:

  1. 二叉树的左子树不断入栈,同时也入数组
  2. 当左子树都访问完了,要访问右子树的时候,取出栈顶的top元素,并且子问题访问右子树cur = top->right
  3. 如此一来可以访问完全部的左右子树

在这里插入图片描述

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> v;
        TreeNode* cur = root;

        while(cur || !st.empty())
        {
            //开始访问一颗树的左边节点
            while(cur)
            {
                v.push_back(cur->val);
                st.push(cur);

                cur = cur->left;
            }

            //左边节点的右路指针需要访问
            TreeNode* top = st.top();
            st.pop();

            cur = top->right;//子问题访问右树  重点!!
        }
        return v;
    }
};

2️⃣二叉树的中序遍历

题目链接:传送

在这里插入图片描述

思路:

  • 要记住中序:左子树 —— 根 —— 右子树
  • cur 不为空或者栈不为空的时候,就说明还没有遍历完
  • 左边节点全部入栈后,遇到空的时候,就要去栈顶top,并且cur = top->right,变到右子树继续

在这里插入图片描述

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> v;
        TreeNode* cur = root;

        while(cur || !st.empty())
        {
            //1、左边节点入栈
            while(cur)
            {
                st.push(cur);
                cur = cur->left;
            }

            //2、当左路节点从栈中出来时,应该访问root和右子树了
            TreeNode* top = st.top();
            st.pop();
            v.push_back(top->val);
            
            cur = top->right;
        }
        return v;
    }
};

3️⃣二叉树的后序遍历

题目链接:传送

在这里插入图片描述

请添加图片描述
思路:

  1. 和前序中序不一样,访问方式:左子树 —— 右子树 —— 根
  2. 定义一个prev,来识别已经已经访问过的节点
  3. 如果遍历完左边节点,右边节点为空or右边节点已经访问过了,则可以访问root

在这里插入图片描述

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) 
    {
        stack<TreeNode*> st;
        vector<int> v;
        TreeNode* cur = root;
        TreeNode* prev = nullptr;
        while(cur || !st.empty())
        {
            //1、左节点入栈
            while(cur)
            {
                st.push(cur);
                cur = cur->left;
            }
 
            //2、当左节点从栈中出来,则表示左子树已经访问过了
            TreeNode* top = st.top();

            if(top->right == nullptr || top->right == prev)
            {
                v.push_back(top->val);
                prev = top;

                st.pop();
            }
            else
            {
                cur = top->right;//子问题访问右子树
            }
        }
        return v;
    }
};

📢写在最后

acwing永远滴神

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大型家政服务平台带小程序端源码 家政服务小程序源码

1. 开发语言&#xff1a;PHP 2. 数据库&#xff1a;MySQL 3.小程序端&#xff1a;Uniapp 4. 带调试视频 5. 可付费调试运行服务 后台功能&#xff1a; 首页、服务管理、商品管理、订单管理、社区管理、城市代理/运营、 营销活动、会员管理、师傅管理、商家/门店、财务管理、合…

警惕!不要让自己的基本功丢失

写这篇文章的缘由是来自己最近我作为面试官的一场面试&#xff0c;我司是。Net stack&#xff0c;这场面试的岗位是后端高级开发。候选人是一个 12 年工作经验的候选人&#xff0c;简历看起来很 nice&#xff0c;国内某 TOP 高校 cs 专业本科毕业&#xff0c;有在大厂甲方外企的…

浙大MBA的录取由初试和复试两面组成

今年7月收到了来自浙大的录取通知书&#xff0c;在拿到录取通知书的那一刻&#xff0c;觉得这一年多备考的艰辛都是值得的。 关于本人情况&#xff1a;2021年备考&#xff0c;刚到而立之年&#xff0c;2012年毕业于一所普通的本科院校&#xff0c;在校期间成绩倒是还好&am…

Vue3 中选项式下的侦听器

目录前言&#xff1a;watch 侦听的分类&#xff1a;函数式的侦听器对象式侦听器创建侦听器停止侦听器总结&#xff1a;前言&#xff1a; 今天小编给大家讲解一下&#xff0c;Vue3 中选项式下的侦听器。 我正在参加 2022年「博客之星」年度总评选&#xff0c;请大家帮我支持一下…

【服务器数据恢复】XFS文件系统分区丢失怎么恢复数据?

服务器数据恢复环境&#xff1a; 磁盘柜RAID卡搭建riad5磁盘阵列; Linux操作系统&#xff1b; 总共一个LUN&#xff0c;划分两个分区;&#xff1a;sdc1分区通过LVM扩容的方式加入到了root_lv中&#xff0c;sdc2分区格式化为XFS文件系统。 服务器故障&#xff1a; 用户为服务器…

本科生学深度学习一轻松搭建强化学习环境,gym的安装

OpenAI Gym 是一个工具包&#xff0c;提供了广泛的模拟环境&#xff0c;也是强化学习的环境&#xff0c;因为想学强化学习&#xff0c;所以需要搭建一个环境&#xff0c;之前一直在代码层面&#xff0c;还是得能看到&#xff0c;比较直观 今天看下怎么安装这个环境 1、官方网站…

【mybatis-plus】Springboot+AOP+自定义注解实现多数据源操作(数据源信息存在数据库)

背景 本文主要讲述的是如何实现动态切换数据源&#xff0c;数据源信息是存储在数据库表里&#xff0c;与在配置文件中写好数据库信息然后用DS("XX")注解不同。 目录 前言 一、准备工作 1.依赖 2.数据库表&#xff08;脚本&#xff09; 3.配置文件 4.自定义注解C…

【MySQL基础教程】约束的介绍与使用

前言 本文为 【MySQL基础教程】约束 相关知识&#xff0c;下边将对约束概述&#xff0c;约束演示&#xff0c;外键约束&#xff08;包括&#xff1a;外键约束介绍、外键约束语法&#xff09;等内容进行详尽介绍~ &#x1f4cc;博主主页&#xff1a;小新要变强 的主页 &#x1…

只懂黑盒测试也能学会的代码覆盖率及精准化测试

测试覆盖率是对测试完成程度的度量。它通常依据某种覆盖准则来对测试用例执行情况进行衡量&#xff0c;以判断测试执行得是否充分 。 ——出自《 计算机科学技术名词 》第三版 今天文章中我们给大家介绍覆盖率统计及覆盖率分析。在10月13日20&#xff1a;00&#xff0c;资深测…

Vue_cli中config文件配置详细注解

我在scr同级目录下创建了config文件夹&#xff0c;里边包含三个文件 它们3个有引用关系 dev引用prod prod.env.js文件 /* * process.argv.splice(2)[0]返回的是node.js的绝对路径 * /usr/local/bin/node */ let HOST process.argv.splice(2)[0] || prod module.exports {NO…

项目实战之旅游网(十)前台用户注册

目录 一.网站首页 二.编写注册界面 三.生成验证码 四.注册流程 五.编写注册方法 六.发送邮件配置 一.网站首页 static/frontdesk下存放前台静态资源&#xff0c;而templates/frontdesk是前台页面 二.编写注册界面 在上个界面点击注册就可以跳转到注册界面 在这里遇到一…

2022 年上海市大学生程序设计竞赛 M. My University Is Better Than Yours

大家总喜欢搞些什么排行榜。有一说一&#xff0c;排行榜通常不重要&#xff0c;除非——比如你老板要你做一下年终总 结。 为了实现建设世界一流大学和建设世界一流学科的目标&#xff0c;不少大学都用各种方式提升排名&#xff1a;发表论文、 申请基金、提升多样性. . . 不过…

Linux操作系统实验4——内存映射

实验要求&#xff1a; 1.在源码中查看file_operations和vm_operations_struct结构定义及其操作对象的方法&#xff0c;重点查看mmap方法fault方法的参选类型。 2.设备模块代码的编写和调试&#xff0c;重新编写file_operations结构中的mmap方法&#xff0c;和vm_operations_str…

美团一面:能不能通俗的解释下为什么要有意向锁这个东西?

面试真题&#xff0c;用通俗的例子解释清楚 MySQL 为什么有了表锁和行锁之后&#xff0c;还要引入意向锁 众所周知&#xff0c;InnoDB 中既有读锁也有写锁&#xff0c;也称为共享锁和排他锁&#xff0c;这两种锁既可以加在整张表上&#xff0c;也可以加在行上。 MySQL 自身就提…

【Apifox】设置apiFox自动获取token

文章目录问题描述解决方案注意事项参考文章问题描述 接口测试时&#xff0c;每次都需要手动登录获取token&#xff0c;先登录系统&#xff0c;从浏览器中复制token&#xff0c;再到apifox的接口上把token帖上去&#xff0c;然后才能去测试具体的接口&#xff1b;更麻烦的是&am…

【实时数仓】热度关键词接口、项目整体部署流程

文章目录一 热度关键词接口1 Sugar配置&#xff08;1&#xff09;图表配置&#xff08;2&#xff09;接口地址&#xff08;3&#xff09;数据格式&#xff08;4&#xff09;执行SQL2 数据接口实现&#xff08;1&#xff09;创建关键词统计实体类&#xff08;2&#xff09;Mappe…

小黑hbase终于勉强跑到了自己的m1 Macbook上啦,虽然终端用不了,但是能从happybase访问的日常积累:happybase简单使用

1.happybase连接 # 连接操作 import happybase# 建立连接 con happybase.Connection(localhost, 9090) con.open() # 输出所有表名称 print(con.tables()) # 关闭传输 con.close() con.open()2.创建表格 # 创建表格 con happybase.Connection(localhost, 9090) # 默认9090…

Android 图像混合技术

Android 图像混合技术 色彩知识 色彩 光学三原色 光学三原色由&#xff1a;红、绿、蓝组成。 色值分别是&#xff1a; 红&#xff08;red &#xff09;&#xff1a;#FF0000 RGB&#xff08;255&#xff0c;0&#xff0c;0&#xff09;绿&#xff08;green&#xff09;&am…

第十九讲:神州路由器基础知识

路由器简介路由器&#xff08;Router&#xff09;是连接Internet中多个网络或网段的网络设备&#xff0c;它能将不同网络或网段之间的数据信息进行“翻译”&#xff0c;以使它们能够相互“读”懂对方的数据&#xff0c;实现不同网络或网段的互联互通。此外&#xff0c;它会根据…

数据平台建设指南(上)

前言 年底了&#xff0c;整理了下过去做的一些项目&#xff0c;希望能够给大数据行业的同学提供些大数据平台建设的思路。内容大致分五部分&#xff1a;数据采集&#xff0c;数据存储、数据计算、基础平台以及数据治理篇。由于涉及到的内容较多&#xff0c;打算分成两篇文章&am…