二叉树地遍历算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三二叉树遍历算法
一、实验目的
1.进一步理解掌握二叉树二叉链表存储结构。
2.掌握二叉树遍历的递归与非递归算法。
二、实验要求
1.认真阅读和掌握(先序、中序、后序和层次)遍历的递归与非递归算法。2.上机调试(先序、中序、后序和层次)遍历的递归与非递归算法。
3.保存和打印出程序的运行结果,并结合程序进行分析。
4.上机后,认真整理源程序及其注释,完成实验报告(包括源程序、实验结果、算法分析、心得体会等)。
三、实验容
先序、中序、后序遍历的递归与非递归算法和层次遍历的算法实现
程序:
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
#define maxsize 100
typedef int datatype;
typedef struct bnode{
datatype data;
struct bnode *lchild,*rchild;
}bnode,*btree;
typedef struct {
bnode *node;
int flag;
}DataType;
typedef struct{
DataType data[maxsize];
int top;
}SeqStack,*PSeqStack;
typedef struct {
btree data[maxsize];
int front,rear;
}SeqQueue,*PSeqQueue;
typedef struct{
btree data[maxsize];
int top;
}SeqStack1,*PSeqStack1;
//建立一个二叉树
btree create()
{
btree t;
char ch;
scanf("%c",&ch);
if(ch=='?')
t=NULL;
else
{
t=(btree)malloc(sizeof(bnode));
t->data=ch;
t->lchild=create();
t->rchild=create();
}
return t;
}
//先序遍历
//入栈操作
void push1(PSeqStack1 s,btree sq)
{
if(s->top==maxsize-1)
printf("栈满不得入栈");
else
{
s->top++;
s->data[s->top]=sq;
}
}
//出栈操作
void pop1(PSeqStack1 s,btree *sq)
{
if(s->top==-1)
printf("栈空不得出栈");
else
{
*sq=s->data[s->top];
s->top--;
}
}
//先序遍历的递归算法
void PreOrder1(btree t)
{
if(t)
{
printf("%c",t->data);
PreOrder1(t->lchild);
PreOrder1(t->rchild);
}
}
//先序遍历的非递归算法
void PreOrder2(btree t)
{
PSeqStack1 s;
s=(PSeqStack1)malloc(sizeof(SeqStack1));
btree p=t;
s->top=-1;
while(p||s->top!=-1)
{
if(p)
{
printf("%c",p->data);
push1(s,p);
p=p->lchild;
}
else
{
pop1(s,&p);
p=p->rchild;
}
}
}
//中序遍历的递归算法
void InOrder1(btree t)
{
if(t)
{
InOrder1(t->lchild);
printf("%c",t->data);
InOrder1(t->rchild);
}
}
//中序遍历的非递归算法
void InOrder2(btree t)
{
PSeqStack1 s;
s=(PSeqStack1)malloc(sizeof(SeqStack1));
btree p=t;
s->top=-1;
while(p||s->top!=-1)
{
if(p)
{
push1(s,p);
p=p->lchild;
}
else
{
pop1(s,&p);
printf("%c",p->data);
p=p->rchild;
}
}
}
//后序遍历的递归算法
void PostOrder1(btree t)
{
if(t)
{
//t=(btree)malloc(sizeof(bnode));
PostOrder1(t->lchild);
PostOrder1(t->rchild);
printf("%c",t->data);
}
}
//后序遍历的非递归算法
//入栈操作
void push(PSeqStack s,DataType sq)
{
if(s->top==maxsize-1)