二叉树的遍历(非递归版)

文章目录

  • 二叉树的前序遍历
  • 二叉树的中序遍历
  • 二叉树的后序遍历

正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂,风趣幽默,忍不住分享一下给大家。 点击跳转到网站。

二叉树的前序遍历

在这里插入图片描述
用递归实现前序遍历非常简单,但是用非递归怎么实现呢?
在这里插入图片描述
比如说这样一棵树,前序遍历是先访问根,再访问左子树、右子树。
但是我们要实现非递归,所以我们肯定要记录每个节点,只有当这个节点,不然我们没办法回来访问右子树,所以我们可以用一个栈,然后一直找到最左边的节点,在把路上节点都push进栈。然后在访问右子树节点。

在这里插入图片描述
我们可以把前序遍历分为这样几个部分,我们每次取一个栈里面的元素,就代表我们已经访问过它的根和左子树了,只需要访问它的右子树就可以了,所以我们去到这个节点后直接pop掉就可以了。只不过我们在找最左边的节点的时候先把这个接点给访问了就可以了。

class Solution {
public:vector<int> preorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> v;//root为空并且栈为空就结束while(root||st.size()){while(root){v.push_back(root->val);st.push(root);root = root->left;}root = st.top()->right;st.pop();}return v;}
};

二叉树的中序遍历

在这里插入图片描述
在这里插入图片描述
同样,我们还是给这样一颗树,中序遍历是要遍历左子树、根、右子树,以这样的次序来遍历。我们可以使用前序遍历的思路,只不过我们先不访问根,我们先找到最左边的节点,然后在访问右子树之前把根给访问了就可以了。

class Solution {
public:vector<int> inorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> v;TreeNode* cur = root;while(cur||!st.empty()){while(cur){st.push(cur);cur = cur->left;}cur = st.top();st.pop();v.push_back(cur->val);cur = cur->right;}return v;}
};

二叉树的后序遍历

在这里插入图片描述
在这里插入图片描述
还是这样一棵树,后序遍历是以左子树、右子树、根,这样的次序来进行遍历。我们会发现,后序遍历用前面两个的思路好像并不能够完成,因为我们访问了右子树会发现根没法访问了,而且我们没法先访问根,我们要先访问它的左子树和右子树然后才能访问根,这样前面的思路就用不了了。

但是我们可以用一个指针来记录上一个访问的节点,但是我们怎么知道这个节点的右子树访问过没有呢?

我们会发现如果当前节点的右子树==记录的上一个节点的指针时,就说明这个颗树的左右子树被访问完了,可以访问根了,或者它的右子树为空也说明可以访问根了,只不过我们在访问的时候,要更新一下prev指针,如果不是这两种情况就说明右子树存在,我们需要访问右子树,直接让当前节点指向它的右孩子就可以了。

ps:每次更新完成后要把cur置空,防止死循环。

class Solution {
public:vector<int> postorderTraversal(TreeNode* root) {stack<TreeNode*> st;vector<int> v;TreeNode* cur = root;TreeNode* prev = nullptr;while(cur||!st.empty()){while(cur){st.push(cur);cur = cur->left;}cur = st.top();if(cur->right==nullptr||cur->right==prev){v.push_back(cur->val);st.pop();prev = cur;cur = nullptr;}else{cur = cur->right;}}return v;}
};

那么今天的分享就到这里了,有什么不懂得可以私信博主,或者添加博主的微信,欢迎交流。

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

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

相关文章

frp新版本frp_0.52.3设置

服务端 frps.toml cp /root/frp/frpc /usr/bin #bindPort 7000 bindPort 7000# 如果指定了“oidc”&#xff0c;将使用 OIDC 设置颁发 OIDC&#xff08;开放 ID 连接&#xff09;令牌。默认情况下&#xff0c;此值为“令牌”。auth.method “token” auth.method "…

想要精通算法和SQL的成长之路 - 摩尔投票法的运用

想要精通算法和SQL的成长之路 - 摩尔投票法的运用 前言一. 多数元素1.1 摩尔投票法 二. 多数元素II2.1 分析 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 多数元素 原题链接 1.1 摩尔投票法 简单来说&#xff0c;假设数组 num 的众数是 x&#xff0c;数组长度为n。 有…

人工智能基础_机器学习044_逻辑回归代码实现与手动计算概率---人工智能工作笔记0084

上面我们已经把逻辑回归的公式,以及,公式对应的图形都画画出来了,然后我们再来看看 如何用代码实现 可以看到上面是代码,咱们自己去写一下 import numpy as np from sklearn.linear_model import LogistieRegression from sklearn import datasets # 训练数据和测试数据拆分…

【Proteus仿真】【Arduino单片机】DS1302时钟

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用PCF8574、LCD1602液晶、DS1302等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示时间日期。 二、软件设计 /* 作者&#xff1a;…

Linux命令之文件管理相关命令

文件操作 Linux系统中常见文件分为普通文件和目录文件。 1.pwd----显示当前工作目录的绝对路径 pwd通常不添加参数&#xff0c;直接在命令行中使用 [itheimalocalhost ~]$ pwd #打印当前工作目录 2.cd--切换目录 [itheimalocalhost ~]$ cd ./public #切换工作…

按键精灵实现打开QQ自动化脚本

以下是基于按键精灵实现的一个打开QQ的功能&#xff0c;其基本的思路是&#xff1a; 1. 滑屏找到图标&#xff1b; 2. 点击图标&#xff1b; 3. 进入登录界面&#xff0c;检测登录按钮&#xff1b; 4. 点击登录&#xff1b; 实现代码如下&#xff1a; Dim 企儿,登录企儿 …

C语言第入门——第十六课

目录 一、分治策略与递归 二、递归 1.求解n的阶乘 2.输入整数、倒序输出 3.输入整数、正序输出 4.计算第n位Fibonacci数列 ​编辑5.无序整数数组打印 6.找到对应数组下标 一、分治策略与递归 在我们遇到大问题的时候&#xff0c;我们的正确做法是将它分解成小问题&a…

uni-app小程序开发使用uView,u-model传入富文本内容过长,真机上无法滚动

uni-app小程序开发使用uView&#xff0c;u-model传入富文本内容过长&#xff0c;真机上无法滚动 找到u-model插件&#xff0c;在slot内容的外层自定义加入一个scroll-view标签&#xff0c;设置scroll-y“true”&#xff0c;指定高度。 <template><view><u-pop…

章鱼网络在 NEARCON23 发布 Octopus 2.0

香港时间2023年11月8日12点&#xff0c;章鱼网络举行第15期 Community Call。 我们在10月8日庆祝了章鱼网络主网上线二周年&#xff0c;并参加了激动人心的 Cosmoverse2023 活动。最重要的是&#xff0c;我们在 Octopus 2.0 的开发中取得了重大进展。 11月8日 Community Call …

vue3 - pinia 中的 storeToRefs

interface.d.ts文件 export interface useMyStore {id: stringcontent: stringtype: stringstatus: booleancollected: booleandate: stringquality: string }useMyStore.js文件 const msgData [{id: 123,content: 腾讯大厦一楼改造施工项目 已通过审核&#xff01;,type: 合…

SQLite3 数据库学习(二):SQLite 中的 SQL 语句详解

参考引用 SQLite 权威指南&#xff08;第二版&#xff09;SQLite3 入门 1. SQL 语句操作 SQLite 数据库 1.1 创建数据表格 create table 表名(字段名 数据类型&#xff0c; 字段名 数据类型&#xff0c; 字段名 数据类型&#xff0c; 字段名 数据类型); 命令行语句结束要加分…

装修干货|卧室常见3个软装搭配问题。福州中宅装饰,福州装修

引言 作为一名软装设计师&#xff0c;我对卧室的家具及软装布置颇有心得&#xff0c;现在就给你们带来卧室装修设计一些小技巧&#xff1a; 1. 床&#xff1b;衣柜&#xff1b;床头柜的摆放 床的摆放位置非常重要&#xff0c;一般要放在离窗户稍远的地方&#xff0c;避免直接…

Git客户端(TortoiseGit)使用

参考文章&#xff1a; https://www.cnblogs.com/xuwenjin/p/8573603.html 【精选】使用TortoiseGit工具进行开发&#xff08;连接远程仓库进行克隆、拉取、获取、提交、推送、新建/切换/合并分支、解决冲突&#xff09;_tortoisegit连接远程仓库-CSDN博客 tortoise git 拉取…

ReentrantLock源码浅析

一、ReentrantLock概念 ReentrantLock是JAVA并发情况下提供的用来加锁的机制&#xff0c;位于JUC包下&#xff0c;提供了一系列的加锁释放锁的方法&#xff0c;使用起来非常简单&#xff0c;只需要在代码块之前调用lock()方法&#xff0c;在finally中调用unlock()方法即可解决…

Postman接收列表、数组参数@RequestParam List<String> ids

示例如下: 接口定义如下: GetMapping(value "/queryNewMoviePath")public List<Map<String, Object>> queryNewMoviePath(RequestParam List<String> ids ) {return service.queryNewMoviePath(ids);}postman中测试如下&#xff1a; http://loc…

【Spring篇】使用注解进行开发

&#x1f38a;专栏【Spring】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出小吉的问题 文章目录 &#x1f33a;原代码&#xff08;无注解&#xff09;&#x1f384;加上注解⭐两个注…

开发模型>螺旋模型

螺旋模型是在快速原型的基础上扩展而成的一种生存周期模型。这种模型将整个软件开发流程分成多个阶段&#xff0c;每个阶段都由4部分组成&#xff0c;它们是&#xff1a; ① 目标设定。为该项目进行需求分析&#xff0c;定义和确定这一个阶段的专门目标&#xff0c;指定对过程和…

分布式下多节点WebSocket消息收发

1、使用场景 2、疑问 第一次发送请求后&#xff0c;通过N1&#xff0c;W2&#xff0c;到达service2&#xff0c;建立websocket连接。 1、接下来发送的消息&#xff0c;通过Ngixn后和网关gateway后还能落在service2上面吗&#xff1f; 如果不能落在service2上&#xff0c;需要怎…

互联网医院系统:数字化时代中医疗服务的未来

随着数字化时代的发展&#xff0c;互联网医院系统在医疗服务中的作用日益凸显。本文将讨论互联网医院系统的一些关键技术方面&#xff0c;探讨这些技术如何推动医疗服务进入数字化时代。 1. 数据智能与个性化服务 互联网医院系统依赖于大数据分析和人工智能技术&#xff0c;…

python文件操作之xml转txt

在使用yolo进行深度学习训练时&#xff0c;我们所使用的标签文件都是txt格式的&#xff0c;但是有的人使用的标注软件生成的可能是xml文件&#xff0c;那么就需要使用python工具写一个格式转换脚本。 首先导入库&#xff0c;并定义标注的图片地址、生成的标签文件xml地址、存储…