二叉树的遍历算法_遍历二叉树算法

2020-02-28 其他范文 下载本文

二叉树的遍历算法由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“遍历二叉树算法”。

实验三 二叉树遍历算法

一、实验目的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){

} if(empty(q))printf(“队空”);else { q->front=(q->front+1)%maxsize;*x=q->data[q->front];} //按照层次遍历二叉树 void LevelOrder1(btree t){ PSeqQueue q;btree p=t;q=init();input(q,p);while(!empty(q)){

output(q,&p);

printf(“%c”,p->data);

if(p->lchild)

input(q,p->lchild);

if(p->rchild)

input(q,p->rchild);} } void main(){ btree t;t=create();printf(“此二叉树的先序递归遍历输出为:”);PreOrder1(t);printf(“n”);

printf(“此二叉树的先序非递归遍历输出为:”);PreOrder2(t);printf(“n”);printf(“此二叉树的中序递归遍历输出为:”);InOrder1(t);printf(“n”);printf(“此二叉树的中序递归遍历输出为:”);InOrder2(t);printf(“n”);printf(“此二叉树的后序递归遍历输出为:”);PostOrder1(t);printf(“n”);

} printf(“此二叉树的后序递归遍历输出为:”);PostOrder2(t);printf(“n”);printf(“此二叉树的层次遍历输出为:”);LevelOrder1(t);printf(“n”);程序结果:

五:实验心得、体会:

熟练地掌握递归算法的核心内容,能够较为熟练地使用递归算法的思想,了解二叉树的各种遍历的特点,了解各种遍历算法的递归算法和非递归算法。

《二叉树的遍历算法.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
二叉树的遍历算法
点击下载文档
相关专题 遍历二叉树算法 遍历 算法 二叉树 遍历二叉树算法 遍历 算法 二叉树
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文