遍历二叉树————非递归后续遍历
来源:互联网 发布:舟山沈四小网络考试 编辑:程序博客网 时间:2024/06/07 17:59
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 1000
typedef
char
datatype;
typedef
struct
Node
{
datatype data;
struct
Node *lchild;
struct
Node *rchild;
}BiTNode, *BiTree;
typedef
struct
{
BiTree da[1000];
int
top;
}SeqStack;
typedef
struct
{
BiTree da[max];
int
front;
int
rear;
}SeqQueue;
SeqQueue *InitQueue()
{
SeqQueue *q;
q = (SeqQueue *)
malloc
(
sizeof
(SeqQueue));
q->front = q->rear = max-1;
return
q;
}
int
IsEmpty(SeqQueue *q)
{
if
(q->front == q->rear)
return
1;
else
return
0;
}
void
EnterQueue(SeqQueue *q,BiTree root)
{
BiTree p;
p = root;
if
((q->rear+1) % max == q->front) {
return
;
}
else
{
q -> rear = (q->rear+1) % max;
q->da[q->rear] = p;
}
}
void
out(SeqQueue *q, BiTree *root)
{
if
(q->front == q->rear)
return
;
else
{
q->front = (q->front+1)%max;
*root = q->da[q->front];
}
}
void
creat(BiTree *root)
{
char
ch;
ch =
getchar
();
if
(ch ==
'#'
) {
*root = NULL;
}
else
{
*root = (BiTree)
malloc
(
sizeof
(BiTNode));
(*root)->data = ch;
creat(&(*root)->lchild);
creat(&(*root)->rchild);
}
}
void
cengci(BiTree root)
{
SeqQueue *s;
BiTree p;
s=InitQueue();
EnterQueue(s,root);
while
(!IsEmpty(s)) {
out(s,&p);
printf
(
"%c"
,p->data);
if
(p->lchild != NULL)
EnterQueue(s,p->lchild);
if
(p->rchild != NULL)
EnterQueue(s,p->rchild);
}
printf
(
"\n"
);
}
//BIAOJI
void
getTop(SeqStack *s, BiTree *p)
{
if
(Empty(s))
return
;
else
*p = s->da[s->top];
}
void
push(SeqStack *s, BiTree root)
{
BiTree p;
p = root;
if
(s->top == 999)
return
;
else
{
s->top++;
s->da[s->top]=p;
}
}
SeqStack *InitStack()
{
SeqStack *s;
s=(SeqStack *)
malloc
(
sizeof
(SeqStack));
s->top = -1;
return
s;
}
int
Empty(SeqStack *s)
{
if
(s->top == -1)
return
1;
else
return
0;
}
void
pop(SeqStack *s, BiTree *root)
{
BiTree p;
p = *root;
if
(Empty(s))
return
;
else
{
*root = s-> da[s->top];
s->top--;
}
}
void
PostOrder(BiTree root)
{
SeqStack *s;
BiTree p,q;
s=InitStack();
p = root;
q = NULL;
while
(p != NULL || !Empty(s)) {
while
(p != NULL) {
push(s,p);
p = p -> lchild;
}
if
(!Empty(s)) {
getTop(s,&p);
if
(p->rchild==NULL || p->rchild == q) {
pop(s,&p);
printf
(
"%c"
,p->data);
q=p;
p=NULL;
}
else
p = p -> rchild;
}
}
}
int
main()
{
BiTree root;
creat(&root);
// cengci(root);
PostOrder(root);
return
0;
}
0 0
- 遍历二叉树————非递归后续遍历
- 树的非递归后续遍历——Java
- 二叉树后续非递归遍历-lintcode
- 遍历二叉树——非递归遍历
- 二叉树的各种遍历(先序、中序、后续、层次)——递归、非递归
- 二叉树遍历——层次遍历、前中后序遍历(递归、非递归)
- 二叉树的遍历——递归和非递归
- 二叉树后续遍历(递归+非递归)
- 递归和非递归实现二叉树的后续遍历
- 遍历二叉树——递归遍历
- 二叉树遍历(先序遍历、中序遍历、后序遍历)——递归方法和非递归方法
- 数据结构二叉树——建立二叉树、中序递归遍历、非递归遍历、层次遍历
- 树——二叉树遍历之非递归实现
- 二叉树(2)——遍历的非递归实现
- 二叉树的非递归遍历——java实现
- 数据结构—二叉树遍历—非递归算法
- 经典算法学习——非递归遍历二叉树
- 二叉树(三)——非递归遍历
- 遍历二叉树——统计结点个数
- [Azure]使用Powershell输出经典模式下全部云服务的VIP
- zookeeper学习
- 匿名namespace的作用
- 生命倒计时-倒数9113日
- 遍历二叉树————非递归后续遍历
- 【课堂】【算术运算中数据类型的转换】
- java判断文件是否存在并创建文件
- 源码-Oracle数据库管理-第十七章-动态SQL语句-Part 5(动态SQL的性能优化技巧)
- Android ListView 源码分析
- adb shell命令整理之监测安卓动作
- 观《逻辑思维 -- 时间的朋友》跨年演讲
- 压缩感知中的数学知识:稀疏、范数、符号arg min
- Lucene读书笔记——3. 为应用程序添加搜索功能