二叉树的三种遍历方式非递归

## 二叉树的遍历需要把当前根节点和左右子树抽象成只有一个根节点和一个左子树,一个右子树的情况

##套路 二叉树的遍历先序中序后序无非是根节点的处理顺序不同,三种遍历方式都有一个相同的逻辑流程,不管怎么样首先将左子树入栈,遍历无非是处理的时机不一样。

1. 先序遍历   根节点的处理顺序和进栈的顺序一致,即进栈并且处理根节点

2. 中序遍历 左节点处理完成之后处理根节点,在程序中就是出栈之后处理根节点

3. 后序遍历(与先序和中序不同)

 栈顶的元素是否处理需要满足条件,出栈入栈的顺序不能简单的和处理根节点的顺序一致,需要记住最近依次处理的结点,

满足条件 1. 栈顶元素的右子树为空 2. 栈顶元素的右子树被处理过

先序和中序代码基本一致:

void search_order(BTNode* node)
{QStack<BTNode*> stack_;BTNode* curNode = node;if (node)// 不管三七二十一 左子树直接入栈{while (curNode){//printf(" %c", curNode->data.toLatin1()); // 进栈之前处理先序stack_.push_back(curNode);curNode = curNode->lchild;}while (!stack_.empty()){curNode = stack_.top(); // 出栈即表示栈顶元素的左子树已经处理完毕stack_.pop();//printf(" %c", curNode->data.toLatin1()); // 出栈之后处理 中序curNode = curNode->rchild;while (curNode){//printf(" %c ", curNode->data.toLatin1()); // 进栈之前处理先序stack_.push(curNode);curNode = curNode->lchild;}}printf("\n");}}

后续遍历:

void Postorder(BTNode* node)
{QStack<BTNode*> stack_;BTNode* curNode = node;BTNode* lastNode = nullptr;if (curNode){while (curNode){stack_.push(curNode);curNode = curNode->lchild;}while (!stack_.empty()) {curNode = stack_.top();// 当前结点需要出栈的条件//① 已访问的结点为当前结点的右节点 // ② 当前结点为叶子结点// ③ 已访问的结点为栈顶元素的左节点 并且有栈顶元素的叶节点为空// 以上三个添加可以合并  栈顶元素的右子树为空,或者栈顶元素的右节点为已访问的结点/*if ( (!curNode->lchild && !curNode->rchild) || (curNode->rchild == lastNode) || (curNode->lchild == lastNode && curNode->rchild == NULL))*/if( curNode->rchild == NULL || curNode->rchild == lastNode){printf(" %c ", curNode->data.toLatin1());lastNode = curNode;stack_.pop();}else{curNode = curNode->rchild;while (curNode){stack_.push(curNode);curNode = curNode->lchild;}}}}
}

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

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

相关文章

Uniapp 跨页面传复杂参、传对象

1、需要传递参数的页面 attended(e) {this.id e.baseIdlet obj {page: this.page,size: this.pageSize,baseId: e.baseId,str: this.struni.navigateTo({url: /pages/index/index?item encodeURIComponent(JSON.stringify(obj))})}}, encodeURIComponent 2、接收参数的页…

GPU深度学习环境搭建:Win10+CUDA 11.7+Pytorch1.13.1+Anaconda3+python3.10.9

1. 查看显卡驱动及对应cuda版本关系 1.1 显卡驱动和cuda版本信息查看方法 在命令行中输入【nvidia-smi】可以当前显卡驱动版本和cuda版本。 根据显示,显卡驱动版本为:Driver Version: 516.59,CUDA 的版本为:CUDA Version 11.7。 此处我们可以根据下面的表1 显卡驱动和c…

大模型咨询培训老师叶梓:利用知识图谱和Llama-Index增强大模型应用

大模型&#xff08;LLMs&#xff09;在自然语言处理领域取得了显著成就&#xff0c;但它们有时会产生不准确或不一致的信息&#xff0c;这种现象被称为“幻觉”。为了提高LLMs的准确性和可靠性&#xff0c;可以借助外部知识源&#xff0c;如知识图谱。那么我们如何通过Llama-In…

将阿里云中数据传输到其他超算服务器

目录 方法一&#xff1a;在阿里云中连接超算&#xff0c;然后使用rsync&#xff08;速度慢&#xff09; 方法2&#xff1a;rclone(速度很快&#xff0c;100G只花了大约20min) 方法一&#xff1a;在阿里云中连接超算&#xff0c;然后使用rsync/scp&#xff08;速度慢&#xff0…

网贷大数据黑名单要多久才能变正常?

网贷大数据黑名单是指个人在网贷平台申请贷款时&#xff0c;因为信用记录较差而被列入黑名单&#xff0c;无法获得贷款或者贷款额度受到限制的情况。网贷大数据黑名单的具体时间因个人信用状况、所属平台政策以及银行审核标准不同而异&#xff0c;一般来说&#xff0c;需要一定…

CrushFTP 服务器端模板注入漏洞复现(CVE-2024-4040)

0x01 产品简介 CrushFTP是由CrushFTP LLC开发的文件传输服务器软件。CrushFTP的主要用途是提供安全、可靠的文件传输服务。它允许用户通过多种协议(如FTP、SFTP、HTTP、WebDAV等)安全地上传、下载和管理文件。CrushFTP提供了许多安全特性,包括SSL/TLS加密、用户认证、目录权…

DDD领域驱动的核心概念

概述 领域的范围关系 领域包含限界上下文&#xff0c;限界上下文包含子域&#xff0c;子域包含聚合&#xff0c;聚合包含实体和值对象。 领域-》限界上下文-》子域&#xff08;微服务&#xff09;-》聚合-》实体值对象。 DDD分层架构 用户接口层 用户接口层是前端应用于微…

mac: docker安装及其Command not found: docker

已经安装了docker desktop&#xff0c;没安装的 点击安装 傻瓜式安装即可 接着打开终端&#xff1a;好一个 Comand not found:docker 看我不把你整顿&#xff0c;解决如下&#xff1a; 如果你在 macOS 上安装了 Docker Desktop&#xff0c;但是终端无法识别 docker 命令&…

微信搜一搜优化:今天你“搜一搜”了吗?

微信“搜一搜”功能的排名规则和机制是微信生态系统中非常重要的一部分&#xff0c;它决定了小程序、公众号、文章、直播等内容在搜索结果中的展示顺序。小柚给大家整理了一份对其排名规则和机制的详细解析&#xff1a; 首先&#xff0c;关键词匹配度是影响搜索结果排名的重要…

HashMap底层实现条分缕析

目录 题外话 正题 哈希表 哈希碰撞 HashMap底层实现 小结 题外话 又水了两天,怪我,在宿舍确实没什么状态,是时候调整调整了 正题 今天直接讲解HashMap底层实现 哈希表 哈希表又称散列表 是数组和单向链表的结合体 如下图 而哈希表存放元素机制是靠哈希函数解析关键…

【问题解决】DDP | 如何使用 DDP 模式来训练模型

在训练 pytorch 模型时&#xff0c;多卡并行训练能够很大程度上提升模型的训练效率 一般来说&#xff0c;有两种多卡并行的训练方式&#xff1a;DP 和 DDP 一、DP 和 DDP 的区别 DP&#xff08;Data Parallelism&#xff09;和DDP&#xff08;Distributed Data Parallelism&…

Jira搭建过程

看到很多小伙伴对jira有兴趣,我们今天就来分享一下jira的搭建吧 首先要明白jira是什么? 看来搭建jira也是我们测试人员需要具备的技能之一了.下面是详细的大家步骤: 1.系统环境准备 Centos 7.5 Mysql 5.6 Java1.8 2.软件安装包 atlassian-jira-software-7.13.0-x64.bin …

【Android 实现AES-CMAC加密】

1. 概述 CMAC&#xff08;Cipher Block Chaining-Message Authentication Code&#xff09;&#xff0c;也简称为CBC_MAC&#xff0c;它是一种基于对称秘钥分组加密算法的消息认证码。由于其是基于“对称秘钥分组算法”的&#xff0c;故可以将其当做是对称算法的一种操作模式。…

Linux_环境变量

目录 1、查询所有环境变量 2、常见的环境变量 2.1 PATH 2.2 HOME 2.3 PWD 3、增加新的环境变量 4、删除环境变量 5、main函数的三个形参 5.1 argv字符串数组 5.2 env字符串数组 6、系统调用接口 6.1 getenv 6.2 putenv 7、全局变量environ 结语 前言&…

SpringBoot + kotlin 协程小记

前言&#xff1a; Kotlin 协程是基于 Coroutine 实现的&#xff0c;其设计目的是简化异步编程。协程提供了一种方式&#xff0c;可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念&#xff1a; 协程是轻量级的&#xff0c;不会创建新的线程。 协程会挂起当前的协…

中颖51芯片学习9. PWM(12bit脉冲宽度调制)

中颖51芯片学习9. PWM&#xff08;12bit脉冲宽度调制&#xff09; 一、资源简介二、PWM工作流程三、寄存器介绍1. PWMx控制寄存器PWMxCON2. PWM0周期寄存器PWM0PH/L3. PWM1周期寄存器PWM1PH/L4. PWM0占空比控制寄存器PWM0DH/L5. PWM1占空比控制寄存器 PWM1DH/L6. 占空比寄存器与…

MacOS 12安装V8Js

一、环境 V8引擎&#xff08;https://github.com/v8/v8&#xff09;是Google的开源JavaScript引擎&#xff0c;性能很高&#xff0c;NodeJs就是采用了V8引擎。V8的作用就解析、运行JavaScript脚本&#xff0c;可以简单理解为JavaScript的解析器。 V8Js&#xff08;https://git…

跨语言指令调优深度探索

目录 I. 介绍II. 方法与数据III. 结果与讨论1. 跨语言迁移能力2. 问题的识别3. 提高跨语言表现的可能方向 IV. 结论V. 参考文献 I. 介绍 在大型语言模型的领域&#xff0c;英文数据由于其广泛的可用性和普遍性&#xff0c;经常被用作训练模型的主要语料。尽管这些模型可能在英…

CDN引入Vue3

选择CDN版本 vue.global.prod.js > 在head中使用 引入后&#xff0c;在后续根组件和子组件中可以通过全局的Vue,来引入对应ref、createApp等方法&#xff0c;如下&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF…

ESLlint重大更新后,使用旧版ESLint搭配Prettier的配置方式

概要 就在前几天&#xff0c;ESLint迎来了一次重大更新&#xff0c;9.0.0版本&#xff0c;根据官方文档介绍&#xff0c;使用新版的先决条件是Node.js版本必须是18.18.0、20.9.0&#xff0c;或者是>21.1.0的版本&#xff0c;新版ESLint将不再直接支持以下旧版配置(非扁平化…