二叉树的非递归遍历(详解)

在这里插入图片描述
二叉树非递归遍历原理
在这里插入图片描述使用先序遍历的方式完成该二叉树的非递归遍历
通过添加现有项目的方式将原来编写好的栈文件导入项目中

在这里插入图片描述
目前项目存在三个文件一个头文件,两个cpp文件:

项目头文件的代码截图:QueueStorage.h
在这里插入图片描述项目头文件的代码:QueueStorage.h

#ifndef LINKSTACK_H
#define LINKSTACK_H
#include <stdio.h>
#include <stdlib.h>// 链式栈的节点
typedef struct LINKNODE {struct LINKNODE* next;
}LinkNode;
// 链式栈
typedef struct LINKSTACK {LinkNode head;int size;}LinkStack;// 初始化函数
LinkStack* Init_LinkStack();
// 入栈
void Push_LinkStack(LinkStack* stack, LinkNode* data);
// 出栈
void Pop_LinkStack(LinkStack* stack);
// 返回栈顶元素
LinkNode* TopLinkStack(LinkStack* stack);
// 返回栈元素的个数
int Size_LinkStack(LinkStack* stack);
// 清空栈
void Clear_LinkStack(LinkStack* stack);
// 销毁栈
void FreeSpace_LinkStack(LinkStack* stack);
#endif

项目cpp文件代码截图:QueueStorage.cpp该文件主要用于栈功能的实现
在这里插入图片描述栈逻辑文件具体代码:QueueStorage.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "QueueStorage.h"// 初始化函数
LinkStack* Init_LinkStack() {LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack));stack->head.next = NULL;stack->size = 0;return stack;
};
// 入栈
void Push_LinkStack(LinkStack* stack, LinkNode* data) {if (stack == NULL) {return;}if (data == NULL) {return;}// 入栈data->next = stack->head.next;stack->head.next = data;stack->size++;
};
// 出栈
void Pop_LinkStack(LinkStack* stack) {if (stack == NULL) {return;}if (stack->size == 0) {return;}// 第一个有效节点LinkNode* pNext = stack->head.next;stack->head.next = pNext->next;stack->size--;};
// 返回栈顶元素
LinkNode* TopLinkStack(LinkStack* stack) {if (stack == NULL) {return NULL;}if (stack->size == 0) {return NULL;}// 返回栈顶元素return stack->head.next;
};// 返回栈元素的个数
int Size_LinkStack(LinkStack* stack) {if (stack == NULL) {return -1;}return stack->size;
};
// 清空栈
void Clear_LinkStack(LinkStack* stack) {if (stack == NULL) {return;}// 清空栈stack->head.next = NULL;stack->size = 0;};
// 销毁栈
void FreeSpace_LinkStack(LinkStack* stack) {if (stack == NULL) {return;}free(stack);
};

二叉树cpp文件截图:BinaryTree.cpp

在这里插入图片描述二叉树cpp文件逻辑代码实现先序遍历:BinaryTree.cpp

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "QueueStorage.h"#define MY_FALSE 0
#define MY_TRUE 1// 二叉树的节点
typedef struct BINARYNODE {// 数据char ch;// 二叉树的左节点struct BINARYNODE* lchild;// 二叉树的右节点struct BINARYNODE* rchild;
}BinaryNode;
//二叉树的非递归遍历
typedef struct BITREESTACKNODE {LinkNode* node;BinaryNode* root;int flag;
}BiTreeStackNode;// 创建栈中的节点
BiTreeStackNode* CreateBiTreeStackNode(BinaryNode* node, int flag) {BiTreeStackNode* newnode = (BiTreeStackNode*)malloc(sizeof(BiTreeStackNode));newnode->root = node;newnode->flag = flag;return newnode;}void NonRecursion(BinaryNode* root) {// 创建栈LinkStack* stack = Init_LinkStack();// 将根节点放入栈中Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(root, MY_FALSE));// 判断栈是否为空while (Size_LinkStack(stack) > 0) {// 先弹出栈顶元素BiTreeStackNode* node = (BiTreeStackNode*)TopLinkStack(stack);Pop_LinkStack(stack);// 判断弹出的节点是否为空if (node->root == NULL) {continue;}if (node->flag == MY_TRUE) {printf("%c", node->root->ch);}else {// 当前节点的右节点入栈Push_LinkStack(stack,(LinkNode*)CreateBiTreeStackNode(node->root->rchild,MY_FALSE));// 当前节点的左节点入栈Push_LinkStack(stack, (LinkNode*)CreateBiTreeStackNode(node->root->lchild, MY_FALSE));// 当前节点入栈node->flag = MY_TRUE;Push_LinkStack(stack, (LinkNode*)node);}}
}
// 二叉树的递归遍历
void Recursion(BinaryNode* root) {if (root == NULL) {return;}printf("%c",root->ch);// 递归遍历Recursion(root->lchild);Recursion(root->rchild);}void CresteBinaryTree() {// 将节点创建出来BinaryNode node1 = { 'A',NULL,NULL};BinaryNode node2 = { 'B',NULL,NULL };BinaryNode node3 = { 'C',NULL,NULL };BinaryNode node4 = { 'D',NULL,NULL };BinaryNode node5 = { 'E',NULL,NULL };BinaryNode node6 = { 'F',NULL,NULL };BinaryNode node7 = { 'G',NULL,NULL };BinaryNode node8 = { 'H',NULL,NULL };// 建立节点之间的关系node1.lchild = &node2;node1.rchild = &node6;node2.rchild = &node3;node3.lchild = &node4;node3.rchild = &node5;node6.rchild = &node7;node7.lchild = &node8;//二叉树的非递归打印NonRecursion(&node1);// 二叉树的递归遍历printf("\n");// Recursion(&node1);
}int main()
{CresteBinaryTree();system("pause");return 0;
}

项目运行结果展示
在这里插入图片描述

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

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

相关文章

达梦(主备)搭建

一、服务器配置 1.扩展基础盘 磁盘分区 /sbin/fdisk /dev/vda<<EOF &> /dev/null p n 4p w EOF 硬盘刷新 partx -s /dev/vda echo "Disk Partition /dev/vda4 Create OK!" pvcreate /dev/vda4 rootlvnamedf -h|grep "\-root"|awk {prin…

全电动注塑机市场分析:全球市场规模将达到223.23亿美元

注射成型机(简称注射机或注塑机)是将热塑性塑料或热固性料利用塑料成型模具制成各种形状的塑料制品的主要成型设备。 注射成型是通过注塑机和模具来实现的。 注塑机通常由注射系统、合模系统、液压传达动系统、电气控制系统、润滑系统、加热及冷却系统、安全监测系统等组成。 注…

如何运用gpt改写出高质量的文章 (1)

大家好&#xff0c;今天来聊聊如何运用gpt改写出高质量的文章 (1)&#xff0c;希望能给大家提供一点参考。 以下是针对论文重复率高的情况&#xff0c;提供一些修改建议和技巧&#xff1a; 如何运用GPT改写出高质量的文章 一、引言 随着人工智能技术的飞速发展&#xff0c;自然…

大一C语言作业 12.8

1.C 对一维数组初始化时&#xff0c;如果全部元素都赋了初值&#xff0c;可以省略数组长度。 这里没有指定数组长度&#xff0c;编译器会根据初始化列表的元素个数来确定数组长度。 2.C 在C语言中&#xff0c;字符数组是不能用赋值运算符直接赋值的。 3.C 在二维数组a中&#x…

《C++新经典设计模式》之第20章 访问者模式

《C新经典设计模式》之第20章 访问者模式 访问者模式.cpp 访问者模式.cpp #include <iostream> #include <list> #include <memory> using namespace std;// 提供一个作用于某对象结构中的各元素的操作表示&#xff0c;便可以在不改变各元素类的前提下定义&…

springboot(ssm寝室小卖部系统 宿舍小商店网站Java(codeLW)

springboot(ssm寝室小卖部系统 宿舍小商店网站Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#x…

【力扣100】7.无重复字符的最长子串

添加链接描述 class Solution:def lengthOfLongestSubstring(self, s: str) -> int:# 思路是使用队列&#xff0c;加入一次取一个最大值&#xff0c;然后如果重复&#xff0c;则队列出到没有重复值位置# 但是这个队列其实使用数组实现的strlist[]temp0result0if len(s)0:re…

字符串指令集

字符串指令的格式 例子1就成功发送了指令 例子2就是发送的字符串有误 查询当前位置就会在附加信息中返回当前座位的坐标 第一个指令的参数就是闪灯的两个参数 如第一个示例就是10ms On Time 第二个就是Off Time 使用标准库来接收字符串命令 字符串指令的接收 因为一个指令就是…

科技改变旅游,道观漫游可视化:智能化管理助力道观游览

道观漫游可视化是一种通过技术手段实现道观游览的可视化展示方式&#xff0c;让游客能够更加直观地了解道观的历史、文化和建筑特色。 随着旅游业的不断发展&#xff0c;道观漫游可视化已经成为了旅游行业中的一个重要方向&#xff0c;吸引了越来越多的游客前来体验。 道观漫游…

打死都不要进外包,看看我在阿里外包的2年...

我18年毕业于一个普通二本学校&#xff0c;是一个很不出名的小本科。大学期间专业知识也没有去认真的学习&#xff0c;所以毕业的时候就随便找了一份工作&#xff0c;在一个小公司做功能测试。 记得那时候薪资大概是6k左右&#xff0c;因为是在工厂&#xff0c;工作环境很差&a…

《Spring Cloud Alibaba 从入门到实战》理论知识篇

基础知识篇 理论篇 俗话说&#xff0c;没有最好的架构&#xff0c;只有最合适的架构。 微服务架构也是随着信息产业的发展而出现的最有普遍适用性的一套架构模式。 通常来说&#xff0c;我们认为架构发展历史经历了这样一个过程&#xff1a;单体架构 -> SOA 面向服务架构 …

springboot智慧导诊系统源码:根据患者症状匹配挂号科室

一、系统概述 医院智慧导诊系统是在医疗中使用的引导患者自助就诊挂号&#xff0c;在就诊的过程中有许多患者不知道需要挂什么号&#xff0c;要看什么病&#xff0c;通过智慧导诊系统&#xff0c;可输入自身疾病的症状表现&#xff0c;或选择身体部位&#xff0c;在经由智慧导诊…

微型5G智能网关助力打造智能清洁机器人

智能机器人不断融入我们的生活&#xff0c;提供了越来越多样化的服务&#xff0c;例如专用于卫生清洁的机器人&#xff0c;就已经广泛应用于酒店、体育馆、大型商场、写字楼、工地等各种场景&#xff0c;相较于人工&#xff0c;机器人在此类具有高度重复性、劳动量大的工作中具…

C++作业6

以下是一个简单的比喻&#xff0c;将多态概念与生活中的实际情况相联系&#xff1a; 比喻&#xff1a;动物园的讲解员和动物表演 想象一下你去了一家动物园&#xff0c;看到了许多不同种类的动物&#xff0c;如狮子、大象、猴子等。现在&#xff0c;动物园里有一位讲解员&…

用23种设计模式打造一个cocos creator的游戏框架----(五)工厂方法模式

1、模式标准 模式名称&#xff1a;工厂方法模式 模式分类&#xff1a;创建型 模式意图&#xff1a;定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到其子类。 结构图&#xff1a; 适用于&#xff1a; 1、当一个类不知道它…

failed to install plugin grafana 插件安装失败

升级时忽略plugins 权限问题&#xff0c;导致安装插件失败&#xff01;调整权限即可

042:el-table表格表头自定义高度(亲测好用)

第042个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

Shrio 安全框架

目录 前言 1.介绍 2.整合 Shiro 到 Spring Boot 3.Shiro 相关配置 总结 前言 几乎所有涉及用户的系统都需要进行权限管理&#xff0c;权限管理涉及到一个系统的安全。Spring Boot 的安全框架整合方案中还有一个璀璨的明珠&#xff1a;Shrio。 1.介绍 Shiro是一款由Java 编…

信道复用技术

目录 一、频分复用FDM&#xff08;Frequency Division Multiplexing&#xff09; 二、波分复用 WDM&#xff08;Wavelength Division Multiplexing&#xff09; 三、时分复用TDM&#xff08;Time Division Multiplexing&#xff09; 四、统计时分复用 STDM&#xff08;Statisti…

双通道5V高细分步进电机驱动芯片应用于摇头机,X,Y控制,聚焦控制,CAMERA云台控制等产品上的芯片选型分析

双通道5V高细分步进电机驱动芯片GC6106&#xff0c;GC6107&#xff0c;GC6119&#xff0c;GC6151&#xff0c;GC6236&#xff0c;GC6225&#xff0c;GC6129&#xff0c;电压范围3~5.5V&#xff0c;最大持续电流可达0.6A左右。可应用于摇头机&#xff0c;X,Y控制&#xff0c;聚焦…