二叉树地遍历算法
- 格式:doc
- 大小:62.62 KB
- 文档页数:8
实用文档
实验三 二叉树遍历算法
一、 实验目的
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) 实用文档
printf("栈满不得入栈");
else
{
s->top++;
s->data[s->top]=sq;
}
}
//出栈操作
void pop(PSeqStack s,DataType *sq)
{
if(s->top==-1)
printf("栈空不得出栈");
else
{
*sq=s->data[s->top];
s->top--;
}
}
//后序遍历的非递归算法
void PostOrder2(btree t)
{
PSeqStack s;
DataType sq;
btree p=t;
s=(PSeqStack)malloc(sizeof(SeqStack));
s->top=-1;
while(p||s->top!=-1)
{
if(p)
{
//s=(PSeqStack)malloc(sizeof(SeqStack));
sq.flag=0;sq.node=p;
push(s,sq);
p=p->lchild;
}
else
{
pop(s,&sq);
p=sq.node;
if(sq.flag==0)
{
sq.flag=1;
push(s,sq);
p=p->rchild; 实用文档
}
else
{
printf("%c",p->data);
p=NULL;
}
}
}
}
//按照层次遍历二叉树
//队列的初始化
PSeqQueue init()
{
PSeqQueue q;
q=(PSeqQueue)malloc(sizeof(SeqQueue));
if(q)
{
q->front=0;
q->rear=0;
}
return q;
}
//判断队空
int empty(PSeqQueue q)
{
if(q&&q->front==q->rear)
return 1;
else return 0;
}
//入队
void input(PSeqQueue q,btree x)
{
if((q->rear+1)%maxsize==q->front)
printf("队满");
else
{
q->rear=(q->rear+1)%maxsize;
q->data[q->rear]=x;
}
}
//出队
void output(PSeqQueue q,btree *x)
{