数据结构——二叉树的非递归算法

二叉树的非递归算法

先序遍历非递归算法1

先序遍历非递归算法2

非递归交换左右孩子算法

使用栈来实现二叉树的非递归算法
栈的基本算法

#include<stdio.h>
#include<bits/stdc++.h> 
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0typedef char TElemType;// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100 	// 存储空间初始分配量
#define STACK_INCREMENT 10 	// 存储空间分配增量
typedef struct BiNode 
{TElemType data;struct BiNode *lchild;struct BiNode *rchild;
}BiNode,*BiTree;typedef BiNode*  ElemType;
typedef struct {ElemType *base; 	// 栈底指针ElemType *top; 	// 栈顶指针int stacksize; 	// 栈空间大小
} SqStack;void InitStack(SqStack &S)
{// 构造一个空栈Sif(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType))))exit(OVERFLOW);     // 存储分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;
}void DestroyStack(SqStack &S)
{// 销毁栈S,S不再存在free(S.base);S.base = NULL;S.top = NULL;S.stacksize = 0;
}void Push(SqStack &S, ElemType e)
{if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间S.base = (ElemType *)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(ElemType));if(!S.base)exit(OVERFLOW);           // 存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACK_INCREMENT;}*(S.top)++ = e;
}Status Pop(SqStack &S, ElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;// 否则返回ERRORif(S.top == S.base)return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, ElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;// 否则返回ERRORif(S.top > S.base) {e = *(S.top - 1);return OK;}elsereturn ERROR;
}Status StackEmpty(SqStack S)
{// 若栈S为空栈,则返回TRUE,否则返回FALSEif(S.top == S.base)return TRUE;elsereturn FALSE;
}

先序遍历非递归算法1

在这里插入图片描述

在这里插入图片描述

void preorder1(BiTree T)//先序遍历算法1 
{BiTree p;SqStack st;InitStack(st);if(T!=NULL){Push(st,T);//根结点进栈while(!StackEmpty(st))//栈不为空时循环{Pop(st,p);printf("%c ",p->data);//退栈结点p并访问if(p->rchild!=NULL)//有右孩子时将其进栈Push(st,p->rchild);if(p->lchild!=NULL)//有左孩子时将其进栈Push(st,p->lchild);}}
}

先序遍历非递归算法2
在这里插入图片描述
在这里插入图片描述

void preorder2(BiTree T)//先序遍历算法2 
{BiTree p;SqStack st;InitStack(st);p=T;while(!StackEmpty(st)||p!=NULL){while(p!=NULL)//访问结点p及其所有左下结点并进栈{printf("%c ",p->data);Push(st,p);p=p->lchild;	}if(!StackEmpty(st))//若栈不空{Pop(st,p);//出栈结点pp=p->rchild;//转向处理其右子树}}}

在这里插入图片描述
在这里插入图片描述

void Inorder2(BiTree T)//中序遍历算法2  
{BiTree p;SqStack st;InitStack(st);p=T;while(!StackEmpty(st)||p!=NULL){while(p!=NULL){Push(st,p);p=p->lchild;}if(!StackEmpty(st)){Pop(st,p);printf("%c ",p->data);p=p->rchild;}}}

非递归交换左右孩子算法
思路:与二叉树的非递归遍历算法相似

 
void Exchange_lchild_rchild(BiTree T)//交换左右子树算法 
{BiTree p;SqStack st;InitStack(st);if(T==NULL) return; if(T->lchild!=NULL||T->rchild!=NULL)//只要是非叶子结点 {Push(st,T);//根结点进栈while(!StackEmpty(st))//栈不为空时循环{Pop(st,p);BiTree temp;temp=p->lchild;p->lchild=p->rchild;p->rchild=temp;if(p->rchild!=NULL)//有右孩子时将其进栈Push(st,p->rchild);if(p->lchild!=NULL)//有左孩子时将其进栈Push(st,p->lchild);}}}

全部代码(可执行代码):

#include<stdio.h>
#include<bits/stdc++.h> 
typedef int Status;
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0typedef char TElemType;// ------栈的顺序存储结构表示----------
#define STACK_INIT_SIZE 100 	// 存储空间初始分配量
#define STACK_INCREMENT 10 	// 存储空间分配增量
typedef struct BiNode 
{TElemType data;struct BiNode *lchild;struct BiNode *rchild;
}BiNode,*BiTree;typedef BiNode*  ElemType;
typedef struct {ElemType *base; 	// 栈底指针ElemType *top; 	// 栈顶指针int stacksize; 	// 栈空间大小
} SqStack;void InitStack(SqStack &S)
{// 构造一个空栈Sif(!(S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType))))exit(OVERFLOW);     // 存储分配失败S.top = S.base;S.stacksize = STACK_INIT_SIZE;
}void DestroyStack(SqStack &S)
{// 销毁栈S,S不再存在free(S.base);S.base = NULL;S.top = NULL;S.stacksize = 0;
}void Push(SqStack &S, ElemType e)
{if(S.top - S.base >= S.stacksize) { // 栈满,追加存储空间S.base = (ElemType *)realloc(S.base, (S.stacksize + STACK_INCREMENT) * sizeof(ElemType));if(!S.base)exit(OVERFLOW);           // 存储分配失败S.top = S.base + S.stacksize;S.stacksize += STACK_INCREMENT;}*(S.top)++ = e;
}Status Pop(SqStack &S, ElemType &e)
{// 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;// 否则返回ERRORif(S.top == S.base)return ERROR;e = *--S.top;return OK;
}Status GetTop(SqStack S, ElemType &e)
{// 若栈不空,则用e返回S的栈顶元素,并返回OK;// 否则返回ERRORif(S.top > S.base) {e = *(S.top - 1);return OK;}elsereturn ERROR;
}Status StackEmpty(SqStack S)
{// 若栈S为空栈,则返回TRUE,否则返回FALSEif(S.top == S.base)return TRUE;elsereturn FALSE;
}void CreateBiTree(BiTree &T)//二叉树的创建 
{TElemType ch;scanf("%c",&ch);if(ch=='#')T=NULL;else {T=(BiNode*)malloc(sizeof(BiNode));if(!T)exit(-1);T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
}void DestroyBiTree(BiTree &T)//二叉树的销毁算法 
{if(T==NULL)exit(-1);else{DestroyBiTree(T->lchild);DestroyBiTree(T->rchild);free(T);}
}void preorder1(BiTree T)//先序遍历算法1 
{BiTree p;SqStack st;InitStack(st);if(T!=NULL){Push(st,T);//根结点进栈while(!StackEmpty(st))//栈不为空时循环{Pop(st,p);printf("%c ",p->data);//退栈结点p并访问if(p->rchild!=NULL)//有右孩子时将其进栈Push(st,p->rchild);if(p->lchild!=NULL)//有左孩子时将其进栈Push(st,p->lchild);}}
}void preorder2(BiTree T)//先序遍历算法2 
{BiTree p;SqStack st;InitStack(st);p=T;while(!StackEmpty(st)||p!=NULL){while(p!=NULL)//访问结点p及其所有左下结点并进栈{printf("%c ",p->data);Push(st,p);p=p->lchild;	}if(!StackEmpty(st))//若栈不空{Pop(st,p);//出栈结点pp=p->rchild;//转向处理其右子树}}}void Inorder2(BiTree T)//中序遍历算法2  
{BiTree p;SqStack st;InitStack(st);p=T;while(!StackEmpty(st)||p!=NULL){while(p!=NULL){Push(st,p);p=p->lchild;}if(!StackEmpty(st)){Pop(st,p);printf("%c ",p->data);p=p->rchild;}}}void postorder(BiTree T)
{BiTree p;SqStack st;InitStack(st);p=T;BiTree r;r=NULL;while(p||!StackEmpty(st)){if(p!=NULL){Push(st,p);p=p->lchild;}else //(p==NULL) {GetTop(st, p);if(p->rchild&&p->rchild!=r){p=p->rchild;Push(st,p);p=p->lchild;}else{Pop(st,p);printf("%c ",p->data);r=p;p=NULL;}	}}} void Exchange_lchild_rchild(BiTree T)//交换左右子树算法 
{BiTree p;SqStack st;InitStack(st);if(T==NULL) return; if(T->lchild!=NULL||T->rchild!=NULL)//只要是非叶子结点 {Push(st,T);//根结点进栈while(!StackEmpty(st))//栈不为空时循环{Pop(st,p);BiTree temp;temp=p->lchild;p->lchild=p->rchild;p->rchild=temp;if(p->rchild!=NULL)//有右孩子时将其进栈Push(st,p->rchild);if(p->lchild!=NULL)//有左孩子时将其进栈Push(st,p->lchild);}}}int main()
{BiTree T;printf("创建树输入树的先序序列\n");CreateBiTree(T);printf("\n先序遍历算法1:");preorder1(T);printf("\n二叉树交换左右孩子算法");Exchange_lchild_rchild(T);printf("\n先序遍历算法2:");preorder2(T);printf("\n中序遍历算法2:");Inorder2(T);printf("\n后序遍历算法1: ");postorder(T);
}

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

signature=fc89d4352b6699754c14ce282ec75426,Method for Assembly of Nucleic Acid Sequence Data

摘要&#xff1a;The present invention relates to a method for assembly of nucleic acid sequence data comprising nucleic acid fragment reads into (a) contiguous nucleotide sequence segment(s), comprising the steps of: (a) obtaining a plurality of nucleic ac…

python字符串的表示_Python字符串方法总结

Python字符串方法图示&#xff1a; &#xff08;温馨提示&#xff1a;对图片点右键——在新标签页中打开图片&#xff09;1、index() 定义&#xff1a;查找并返回指定str的索引位置&#xff0c;如果没找到则会抛异常&#xff08;查找的顺序是从左至右&#xff09;可以指定范围&…

Kuma 1.0 GA发布,70多项新功能和改进

喜欢就关注我们吧&#xff01;Kuma 1.0 GA 现已发布&#xff0c;包含了 70 多种新功能和改进。Kuma 是一个现代的通用服务网格控制平面&#xff0c;基于 Envoy 搭建&#xff0c;Envoy 是一个为云原生应用设计的强大的代理软件。Kuma 高效的数据平面和先进的控制平面&#xff0c…

html圆点边框代码,HTML边框代码模板1

都说女人是男人的肋骨蜕变而来&#xff0c;是男人的心肝.可那一朵一朵微微卷起的发梢&#xff0c;点朱唇&#xff0c;纤细白皙的手指&#xff0c;踩着男人心底高跟鞋的我并不是他美丽的天使&#xff0c;往事在耳边环绕&#xff0c;现在的他人在那里&#xff0c;我不闻不问&…

递归函数斐波那契数列python_使用Python函数递归实现斐波那契数列时为什么运行速度很慢?...

你看看你递归代码的复杂度 是O(2^n) 而第二个的复杂度是O(n) 运行效率当然不同 COUNTER 0 def fibn(n): global COUNTER COUNTER 1 if n 0: return 1 elif n 1: return 1 else: return fibn(n-1) fibn(n-2) statistics [] for i in range(35): COUNTER 0 fibn(i 1) sta…

还在犹豫是否迁移.NET5?这几个项目已经上线了!

.NET5正式发布有十多天&#xff0c;博客园、知乎、技术群都讨论的非常热烈。关于项目是否迁移.NET5的话题讨论的尤为热烈&#xff0c;作为.NET十年老司机要告诉你&#xff0c;.NET5的迁移势在必行&#xff0c;当下就是最好的时机&#xff01;犹豫项目是否升级到.NET5的&#xf…

Android切换泰语,Android应用内切换语言

首先扯点别的&#xff1a;这是第一次在简书上写东西&#xff0c;我突然明白为啥这么多人在简书上写东西了&#xff0c;因为没有广告啊&#xff0c;哈哈。最近接触到Android 应用内切换语言的问题&#xff0c;研究了两天&#xff0c;做个记录先。实现了中文&#xff0c;英文&…

工程勘察设计收费标准2002修订版_黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计招标...

黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计第一标段招标公告招标编号&#xff1a;JTZGSJ20200011.招标条件本招标项目黑龙江省哈尔滨新区智能轨道快运系统1号线项目勘察设计已由上级部门批准建设&#xff0c;项目业主为哈尔滨交通集团有限公司&#xff0c;建设资金来…

从 3.1 到 5.0 —— OpenReservation 更新记

OpenReservation 从 asp.net core 3.1 到 5.0IntroOpenReservation 是一个开源的预约系统&#xff0c;最初的版本是我们学校的活动室预约系统&#xff0c;现在正逐步变成一个更为通用的预约系统。.NET5 发布之后也是把这个项目更新到了 5.0。这个项目是一个做了很长时间的项目&…

html如何显示上传进度条,HTML5 Ajax文件上传进度条如何显示

这篇文章主要介绍了HTML5 Ajax文件上传进度条是如何显示的&#xff0c;基于原生html5实现&#xff0c;不需要falsh支持&#xff0c;进度可以自定义显示&#xff0c;控制灵活&#xff0c;对HTML5上传进度条感兴趣的小伙伴们可以参考一下原本打算使用jquery插件进行异步文件上传&…

数据结构——哈弗曼编码问题

实验六 基于哈夫曼树的数据压缩算法 【实验目的】 掌握哈夫曼树的构造算法。掌握哈夫曼编码的构造算法。 【实验内容】 问题描述 输入一串字符,根据给定的字符串中字符出现的频率建立相应的哈夫曼树, 构造哈夫曼编码表,在此基础上可以对压缩文件进行压缩(即编码),同时可以对 压…

relation does not exist报错是什么意思_为什么Zookeeper天生就是一副分布式锁的胚子?...

“ 什么是分布式锁&#xff1f;分布式锁是控制分布式系统之间同步访问共享资源的一种方式。在分布式系统中&#xff0c;常常需要协调他们的动作。图片来自 Pexels如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源&#xff0c;那么访问这些资源的时候&#xff0…

netcore一键部署到linux服务器以服务方式后台运行

AntDeploy 是我开发一款开源一键发布插件将本地vs中的代码&#xff0c;一键打包&#xff0c;部署到任意的远程服务器部署方式支持 windows服务&#xff0c;linux服务&#xff0c;docker容器&#xff0c;iis支持增量发布(只更新有修改的)支持一键回滚(出了问题快速恢复)支持查看…

王某调离岗位后所使用计算机由新到任陈某,2017年沧州事业单位考试模拟卷

55. 关于刑法&#xff0c;表述正确的有&#xff1a;A.对于累犯不适用缓刑B.某甲犯故意杀人罪&#xff0c;但是有可能被适用缓刑C.已满十四周岁不满十六周岁的人不负刑事责任D.紧急避险超过必要限度造成不应有的损害的&#xff0c;应当负刑事责任56. 甲在回家途中发现乙正持刀追…

数据结构——基于 Dijsktra 算法的最短路径求解

实验七 基于 Dijsktra 算法的最短路径求解 【实验目的】 掌握图的邻接矩阵表示法&#xff0c;掌握采用邻接矩阵表示法创建图的算法。掌握求解最短路径的 Dijsktra 算法。 【实验内容】 问题描述 一张地图包括 n 个城市,假设城市间有 m 条路径(有向图),每条路径的长度 已知。给…

loadrunner录制事件为0_测试工具LoadRunner常见问题汇总,解决方案整理

LoadRunner是一种预测系统行为和性能的负载测试工具。通过以模拟上千万用户实施并发负载及实时性能监测的方式来确认和查找问题&#xff0c;可适用于各种体系架构的自动负载测试&#xff0c;能预测系统行为并评估系统性能。我们在使用它进行测试的过程中经常会遇到一些错误&…

.NET应用如何优雅的实现功能定时开关

点击上方蓝字关注“汪宇杰博客”导语我们在打工的时候&#xff0c;总能遇到一种类型的需求&#xff1a;“我想要这个活动广告在双11期间才显示”&#xff0c;“我想要这个API在20号以后才开放”&#xff0c;可能你觉得这个需求没什么难的&#xff0c;写个时间判断不就行了&…

用计算机组成原理+唐朔飞的,计算机组成原理 唐朔飞 习题解答

地址总线&#xff1a;用来指出数据总线上的源数据或目的数据在贮存单元的地址&#xff0c;是单向传输的&#xff0c;其位数与存储单元的个数有关(几次幂的关系)控制总线&#xff1a;用来发出各种控制信号的&#xff0c;对任意控制线&#xff0c;是单向的&#xff1b;对与机器字…

数据结构——图-迪杰斯特拉算法

问题描述 将图以邻接矩阵或邻接表存储&#xff0c;实现Dijkstra算法。 算法设计 迪杰斯特拉算法&#xff1a; 1.假设用带权的邻接矩阵arc&#xff0c;来表示带权有向图&#xff0c;arc[i][j]&#xff0c;表示弧<vi,vj>上的权值。若<vi,vj>不存在&#xff0c;则置…

单体 soa 微服务 区别_漫谈何时从单体架构迁移到微服务?

面对微服务如火如荼的发展&#xff0c;很多人都在了解&#xff0c;学习希望能在自己的项目中帮得上忙&#xff0c;当你对微服务的庐山真面目有所了解后&#xff0c;接下来就是说服自己了&#xff0c;到底如何评估微服务&#xff0c;什么时候使用微服务&#xff0c;什么时间点最…