二叉树非递归遍历 C语言实现
更新时间:2023-08-07 01:26:01 阅读量: 实用文档 文档下载
- 二叉树非递归遍历推荐度:
- 相关推荐
二叉树非递归遍历 算法文档内有简要概括
#include <stdio.h>
#include <stdlib.h>
typedef struct BitNode
{
char data;
BitNode *lchild,*rchild;
int ltag,rtag;
}BitNode,*BitTree,ElemType; //树的结构体定义
typedef struct node
{
ElemType stack;
struct node *next;
}linkstack; //栈的结构体定义
int initstack(linkstack **s)//初始化一个带头结点的空栈
{
*s=(linkstack *)malloc(sizeof(linkstack));
if(*s==NULL)exit(-1);
(*s)->next=NULL;
return 1;
}
int push(linkstack *s,ElemType *x)//入栈操作,将x的数据元素插入栈s中,使x成为新的栈顶元素
{
linkstack *p,*q;
q=s;
p=(linkstack *)malloc(sizeof(linkstack));
if(!p)exit(-1);
p->stack=*x;
p->next=NULL;
while(q->next)
q=q->next;
q->next=p;
return 1;
}
/////////////////////////////////////////////////
//因为非递归遍历算法 调用的栈不需要 全部出栈
//进栈的链表实现的 真正算法为
// q->stack=*x;
// q->next=S->next;
// S->next=q;
////////////////////////////////////////////////
int pop(linkstack *s,ElemType *e)//出栈操作,先将栈s的栈顶结点的值送到e所指向的内存单元,然后删除栈顶结点
{
linkstack *p,*q;
p=s;
if(s->next==NULL)return 0;
while(p->next)
{
q=p;
p=p->next;
}
q->next=NULL;
*e=p->stack;
free(p);
return 1;
}
int emptystack(linkstack *s)//判断栈是否为空
{
if(s->next==NULL)return 1;
else return 0;
}
int gettop(linkstack *s,ElemType *e)
{
linkstack *p,*q;
p=s;
if(s->next==NULL)return 0;
while(p->next)
{
q=p;
p=p->next;
}
*e=p->stack;
return 1;
}
BitTree CreateBiTree()
{
BitTree bt;
char x;
x=getchar();
if(x=='#') bt=NULL;
else
{
bt=(BitTree)malloc(sizeof(BitNode));
bt->data=x;
bt->lchild=NULL;
bt->rchild=NULL;
bt->lchild=CreateBiTree();
bt->rchild=CreateBiTree();
}
return bt;
}
//////////////////////////////////////////////////////////////////////////
//Comment:非递归先序遍历 二叉树
//Algorithm:沿着左指针访问沿途经过的根节点,同时将右指针进栈,以便在递归访
//问左子树完成后能得到右子树的根节点的地址,如此重复进行,直到栈空。
//////////////////////////////////////////////////////////////////////////
void PreOrderBiTree(BitTree T)
{
linkstack *S;
BitTree p,q;
q=(BitTree)malloc(sizeof(BitNode));
initstack(&S);
p=T;
while(p||!emptystack(S))
{
while (p)
{
printf("%c ",p->data);
push(S,p);
p=p->lchild;
}
if(pop(S,q))
p=q->rchild;
}
}
//////////////////////////////////////////////////////////////////////////
//Comment:非递归中序遍历 二叉树
//Algorithm:先沿着左指针走到二叉树中最左下的结点,即左指针为空的结点,将沿
//途经过的根节点,指针进栈。当左指针为空时,从栈中取出根节点访问,然后再跳
//到右子树上。
//////////////////////////////////////////////////////////////////////////
void InOr
二叉树非递归遍历 算法文档内有简要概括
derBiTree(BitTree T)
{
linkstack *S;
BitTree p,q;
q=(BitTree)malloc(sizeof(BitNode));
initstack(&S);
p=T;
while (p||!emptystack(S))
{
while (p)
{
push(S,p);
p=p->lchild;
}
pop(S,q);
printf("%c",q->data);
p=q->rchild;
}
}
//////////////////////////////////////////////////////////////////////////
//Comment:非递归后续遍历 二叉树
//Algorithm:先沿着左指针走到二叉树中最左下的结点,将沿途经过的根节点指针进
//栈,若右子树为空,则弹栈并访问根节点,否则,跳到右子树上。
//////////////////////////////////////////////////////////////////////////
void PostOrderBiTree(BitTree T)
{
linkstack *S;
BitTree p,q;
char flag;//标记访问过的节点
initstack(&S);
q=(BitTree)malloc(sizeof(BitNode));
p=T;
while (p||!emptystack(S))
{
if(p!=q)
{
while(p) //当子树p不为空时 进栈
{
push(S,p);
if(p->lchild)p=p->lchild; //不为空 后移指向左子树
else p=p->rchild; //为空指向 右子树
}
}
if (emptystack(S))break;
gettop(S,q);
if(q->rchild==p) //判断是 遍历过 右子树 如遍历过右子树 说明该遍历根子树
{
p=(BitTree)malloc(sizeof(BitNode));
pop(S,p);
printf("%c",p->data);
p=q;
flag = p->data; //记录 遍历过的子树
}
else
{
p=q->rchild;
if (flag == p->data)//如果根节点的右子树刚刚访问完成,那么打印根节点。
{
p=(BitTree)malloc(sizeof(BitNode));
pop(S,p);
printf("%c",p->data);
p=q;
flag = p->data;
}
}
}
}
正在阅读:
二叉树非递归遍历 C语言实现08-07
我那飞舞的时代作文07-14
初中化学易错题整理08-12
假如我成了蜜蜂作文400字06-27
大学生入党自传范文3篇02-23
丝绸之路欢乐大世界投资建设项目可行性研究报告-广州中撰咨询09-07
自己做的ARM的UDP通信实验 - 图文04-20
2018年电子商务设计师上午真题+答案10-28
令人回味的一件事作文600字06-16
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 递归
- 遍历
- 语言
- 实现
- 糖尿病的按摩穴位
- 药品许可证筹建模版
- 高考作文最新时事素材积累与点评(2014)
- 仓库管理流程用友ERP-U8、T6集成最新范例
- 新版山西大学音乐考研经验考研参考书考研真题
- 2015年中国超白玻璃行业全景调研报告
- 英语:Unit_9_When_was_he_born_Section_B课件(人教新目标八年级上)
- 第九章中国文化概论建筑文化
- 计算机网络 运输层ppt
- 幼儿园中班数序教案
- 华南理工大学成人高等学历教育专科毕业实习报告
- 第4课文艺复兴与宗教改革
- 《生活与哲学》学习课件:第二课(1)哲学的基本问题
- 兴趣物理实验课程纲要
- 岗位竞聘典型试题精选
- 2015中级会计职称考试知识点《财务管理》:筹资方式
- 有效教学的理念与实践 学习时间安排
- 王力宏—爱的就是你—歌词
- 天然药物化学习题与参考答案
- 记承天寺夜游》对比阅读