二叉树的各种基本操作实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
char ch;
ch=getchar();
if(ch=='#')
bt=NULL;
else
{
bt=(BiTree)malloc(sizeoБайду номын сангаас(BiTNode));
bt->data=ch;
PreCreatBiTree(bt->lchild);
PreCreatBiTree(bt->rchild);
}
}
void InOrderTraverse1(BiTree bt)
if(!S.base)
exit(0);//存储分配失败
S.stacksize+=STACKINCREMENT;
}
S.base[S.top++]=e;
}//Push
void Pop(SqStack &S,BiTree &e)
{
//若栈不空则删除S的栈顶元素,并用e返回其值
if (S.top==0)
{
printf("栈空"); //栈为空
{
char data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;//将BiTree定义为指向二叉链表结点结构的指针类型
BiTNode *bt;
typedef struct {
BiTree *base;
int top;
PostOrderTraverse1(bt->rchild);
printf("%2c",bt->data);
}
}
void LeverlOrderTraverse(BiTree bt)
{//层次遍历二叉树
SqQueue Q;
BiTree p;
if(bt)
{
InitQueue(Q);
EnQueue(Q,bt);
int stacksize;
}SqStack;
typedef struct
{
BiTree *base;
int front;
int rear;
}SqQueue;
void InitStack(SqStack &S)
{
//构造一个空栈S
S.base=(BiTree*) malloc(STACK_INIT_SIZE*sizeof(BiTree));
void InOrderTraverse2(BiTree bt)
{//非递归对bt进行中序遍历
if(bt)
{
SqStack S;
BiTree p;
InitStack(S);
Push(S, bt); //根指针进栈
while(!StackEmpty(S))
{
while(GetTop(S,p)&&p)//栈顶元素非空
return 1;
else return 0;
}//StcakEmpty
void Push(SqStack &S, BiTree e)
{
//插入元素e为新的栈顶元素,
if (S.top>=S.stacksize)
{//栈满追加空间
S.base=(BiTree*) realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree));
printf("<---遍历二叉树--->\n");
printf("先序遍历二叉树递归算法\n");
PreOrderTraverse1(bt);
printf("\n先序遍历二叉树非递归算法\n");
PreOrderTraverse2(bt);
printf("\n中序遍历二叉树递归算法\n");
InOrderTraverse1(bt);
void PreOrderTraverse2(BiTree bt)
{
//非递归对bt进行先序遍历
SqStack S;
BiTree p;
if(bt){
InitStack(S);
Push(S, bt);//根指针进栈
while(!StackEmpty(S))
{
while(GetTop(S,p) && p)
if (!S.base) exit (0); //存储分配失败
S.top=0; //空表长度为0
S.stacksize=STACK_INIT_SIZE; //初始存储容量
}//InitStack
int StackEmpty(SqStack &S)
{
//判断栈S是否是空栈,是返回1,否则返回0
if(S.top==0)
while(!QueueEmpty(Q))
{
DeQueue(Q,p);
printf("%2c",p->data);
if(p->lchild)
EnQueue(Q,p->lchild);
if(p->rchild)
EnQueue(Q,p->rchild);
}//while
}//if
}//LeverlOrderTraverse
}
}//GetTop
void InitQueue(SqQueue &Q)
{//构建新队列Q
Q.base=(BiTree*)malloc(MAX * sizeof(BiTree));
Q.front=Q.rear=0;
}
int QueueEmpty(SqQueue Q)
{//判断队列是否是一个空队列
if(Q.front==Q.rear)
Pop(S,p); //左右孩子处理完了
printf("%2c",p->data);//访问根结点
while(!StackEmpty(S)&&GetTop(S,q)&&q->rchild==p)
//并且刚刚访问的结点为栈顶元素的右孩子时,让栈顶元素出栈并访问他
{
Pop(S,p);
printf("%2c",p->data);
}
if(! StackEmpty (S))
{
GetTop(S,p);
Push(S,p->rchild);
}
}//if
}//if
}
}//PostOrderTraverse
void PutOutLeaf(BiTree bt)
{//返回值为bt的叶子数
if(bt)
{
if(bt->lchild==NULL&&bt->rchild==NULL)
if(bt)
{
n++;
CountNodes( bt->lchild,n);
CountNodes( bt->rchild,n);
}
}
void main()
{
int n=0;
printf("先序建立二叉树,'#'代表虚结点\n");
printf("请输入你所建立二叉树的字符串\n");
PreCreatBiTree(bt);
exit(0);
}
e=S.base[--S.top];
}//Pop
int GetTop(SqStack S, BiTree &e)
{
//若栈不空则用e返回S的栈顶元素
if (S.top==0)
{
printf("栈空");
return 0;//栈为空
}
else
{
e=S.base[S.top-1];
return 1;
Push(S,p->lchild); //向左一直走到尽头
Pop(S,p);//空指针退栈
//对左子树操作完毕,再判断右子树
if(!StackEmpty(S))//栈非空
{
GetTop(S,p);
Push(S,p->rchild);//右孩子入栈
if(GetTop(S,p)&&p==NULL)
{
Pop(S,p); //空结点出栈
{
printf("%2c",bt->data);
}
else
{
if(bt->lchild)
{
PutOutLeaf(bt->lchild);
}
if(bt->rchild)
{
PutOutLeaf(bt->rchild);
}
}
}
}
void CountNodes(BiTree bt,int &n)
{//输出总的节点数
printf("\n中序遍历二叉树非递归算法\n");
InOrderTraverse2(bt);
printf("\n后序遍历二叉树递归算法\n");
PostOrderTraverse1(bt);
printf("\n后序遍历二叉树非递归算法\n");
PostOrderTraverse2(bt);
printf("\n层次遍历二叉树\n");
实验项目
二叉树的操作
项目类型
综合型
完成时间
2009-11-2
实验目的及要求
掌握二叉树的存储实现;掌握二叉树的遍历思想;掌握二叉树的常见算法的程序实现。
【实验过程】(实验步骤、绘图、记录、数据、分析、结果)
实验内容:
a.输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##建立二叉树,实现先序、中序和后序以及按层次遍历序列。
return 1;
return 0;
}
void EnQueue(SqQueue &Q,BiTree e)
{//将元素e插入到队列Q中
if((Q.rear+1)%MAX==Q.front)
exit(0);
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAX;
}
void DeQueue(SqQueue &Q,BiTree &e)
{
printf("%2c",p->data);
Push(S, p->lchild);
} //向左一直走到尽头
Pop(S,p);//空指针退栈
if(!StackEmpty(S))
{
Pop(S,p);
Push(S, p->rchild);
}
}//while
}//if
}// PreOrderTraverse
Push(S, p->lchild); //向左一直走到尽头
Pop(S, p);//空指针退栈
if(!StackEmpty(S))
{
Pop(S,p);
printf("%2c",p->data);
Push(S, p->rchild);
}//if
}//while
}//if
}// InOrderTraverse
void PostOrderTraverse2(BiTree bt)
{
//非递归对bt进行后序遍历
SqStack S;
BiTree p,q;
InitStack(S);
Push(S,bt);//根指针进栈
while(!StackEmpty(S))
{
while(GetTop(S,p)&&p) //栈顶元素非空
{//将非空队列Q的队头元素出队列
if(Q.front==Q.rear)
exit(0);
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAX;
}
//int n0,n;//n0统计叶子结点数,n统计总的结点数
void PreCreatBiTree(BiTree &bt)
{//按照先序建立二叉树的二叉链表"#"表示虚结点
b.求所有叶子及结点总数。
实验步骤:
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
#define STACK_INIT_SIZE 40 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct BiTNode
LeverlOrderTraverse(bt);
printf("\n叶子结点是\n");
PutOutLeaf(bt);
CountNodes(bt,n);
printf("\n结点总数是:%d",n);
printf("\n");
}实验运行结果
教师批阅评语:
成绩评定
教师签名:年月日
优秀
良好
中等
及格
不及格
{//利用递归算法中序遍历一个二叉树
if(bt)
{
InOrderTraverse1(bt->lchild);
printf("%2c",bt->data);
InOrderTraverse1(bt->rchild);
}
}
void PreOrderTraverse1(BiTree bt)
{//递归算法对二叉树进行先序便利
if(bt)
{
printf("%2c",bt->data);
PreOrderTraverse1(bt->lchild);
PreOrderTraverse1(bt->rchild);
}
}
void PostOrderTraverse1(BiTree bt)
{//利用递归后序遍历二叉树
if(bt)
{
PostOrderTraverse1(bt->lchild);
ch=getchar();
if(ch=='#')
bt=NULL;
else
{
bt=(BiTree)malloc(sizeoБайду номын сангаас(BiTNode));
bt->data=ch;
PreCreatBiTree(bt->lchild);
PreCreatBiTree(bt->rchild);
}
}
void InOrderTraverse1(BiTree bt)
if(!S.base)
exit(0);//存储分配失败
S.stacksize+=STACKINCREMENT;
}
S.base[S.top++]=e;
}//Push
void Pop(SqStack &S,BiTree &e)
{
//若栈不空则删除S的栈顶元素,并用e返回其值
if (S.top==0)
{
printf("栈空"); //栈为空
{
char data;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;//将BiTree定义为指向二叉链表结点结构的指针类型
BiTNode *bt;
typedef struct {
BiTree *base;
int top;
PostOrderTraverse1(bt->rchild);
printf("%2c",bt->data);
}
}
void LeverlOrderTraverse(BiTree bt)
{//层次遍历二叉树
SqQueue Q;
BiTree p;
if(bt)
{
InitQueue(Q);
EnQueue(Q,bt);
int stacksize;
}SqStack;
typedef struct
{
BiTree *base;
int front;
int rear;
}SqQueue;
void InitStack(SqStack &S)
{
//构造一个空栈S
S.base=(BiTree*) malloc(STACK_INIT_SIZE*sizeof(BiTree));
void InOrderTraverse2(BiTree bt)
{//非递归对bt进行中序遍历
if(bt)
{
SqStack S;
BiTree p;
InitStack(S);
Push(S, bt); //根指针进栈
while(!StackEmpty(S))
{
while(GetTop(S,p)&&p)//栈顶元素非空
return 1;
else return 0;
}//StcakEmpty
void Push(SqStack &S, BiTree e)
{
//插入元素e为新的栈顶元素,
if (S.top>=S.stacksize)
{//栈满追加空间
S.base=(BiTree*) realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTree));
printf("<---遍历二叉树--->\n");
printf("先序遍历二叉树递归算法\n");
PreOrderTraverse1(bt);
printf("\n先序遍历二叉树非递归算法\n");
PreOrderTraverse2(bt);
printf("\n中序遍历二叉树递归算法\n");
InOrderTraverse1(bt);
void PreOrderTraverse2(BiTree bt)
{
//非递归对bt进行先序遍历
SqStack S;
BiTree p;
if(bt){
InitStack(S);
Push(S, bt);//根指针进栈
while(!StackEmpty(S))
{
while(GetTop(S,p) && p)
if (!S.base) exit (0); //存储分配失败
S.top=0; //空表长度为0
S.stacksize=STACK_INIT_SIZE; //初始存储容量
}//InitStack
int StackEmpty(SqStack &S)
{
//判断栈S是否是空栈,是返回1,否则返回0
if(S.top==0)
while(!QueueEmpty(Q))
{
DeQueue(Q,p);
printf("%2c",p->data);
if(p->lchild)
EnQueue(Q,p->lchild);
if(p->rchild)
EnQueue(Q,p->rchild);
}//while
}//if
}//LeverlOrderTraverse
}
}//GetTop
void InitQueue(SqQueue &Q)
{//构建新队列Q
Q.base=(BiTree*)malloc(MAX * sizeof(BiTree));
Q.front=Q.rear=0;
}
int QueueEmpty(SqQueue Q)
{//判断队列是否是一个空队列
if(Q.front==Q.rear)
Pop(S,p); //左右孩子处理完了
printf("%2c",p->data);//访问根结点
while(!StackEmpty(S)&&GetTop(S,q)&&q->rchild==p)
//并且刚刚访问的结点为栈顶元素的右孩子时,让栈顶元素出栈并访问他
{
Pop(S,p);
printf("%2c",p->data);
}
if(! StackEmpty (S))
{
GetTop(S,p);
Push(S,p->rchild);
}
}//if
}//if
}
}//PostOrderTraverse
void PutOutLeaf(BiTree bt)
{//返回值为bt的叶子数
if(bt)
{
if(bt->lchild==NULL&&bt->rchild==NULL)
if(bt)
{
n++;
CountNodes( bt->lchild,n);
CountNodes( bt->rchild,n);
}
}
void main()
{
int n=0;
printf("先序建立二叉树,'#'代表虚结点\n");
printf("请输入你所建立二叉树的字符串\n");
PreCreatBiTree(bt);
exit(0);
}
e=S.base[--S.top];
}//Pop
int GetTop(SqStack S, BiTree &e)
{
//若栈不空则用e返回S的栈顶元素
if (S.top==0)
{
printf("栈空");
return 0;//栈为空
}
else
{
e=S.base[S.top-1];
return 1;
Push(S,p->lchild); //向左一直走到尽头
Pop(S,p);//空指针退栈
//对左子树操作完毕,再判断右子树
if(!StackEmpty(S))//栈非空
{
GetTop(S,p);
Push(S,p->rchild);//右孩子入栈
if(GetTop(S,p)&&p==NULL)
{
Pop(S,p); //空结点出栈
{
printf("%2c",bt->data);
}
else
{
if(bt->lchild)
{
PutOutLeaf(bt->lchild);
}
if(bt->rchild)
{
PutOutLeaf(bt->rchild);
}
}
}
}
void CountNodes(BiTree bt,int &n)
{//输出总的节点数
printf("\n中序遍历二叉树非递归算法\n");
InOrderTraverse2(bt);
printf("\n后序遍历二叉树递归算法\n");
PostOrderTraverse1(bt);
printf("\n后序遍历二叉树非递归算法\n");
PostOrderTraverse2(bt);
printf("\n层次遍历二叉树\n");
实验项目
二叉树的操作
项目类型
综合型
完成时间
2009-11-2
实验目的及要求
掌握二叉树的存储实现;掌握二叉树的遍历思想;掌握二叉树的常见算法的程序实现。
【实验过程】(实验步骤、绘图、记录、数据、分析、结果)
实验内容:
a.输入完全二叉树的先序序列,用#代表虚结点(空指针),如ABD###CE##F##建立二叉树,实现先序、中序和后序以及按层次遍历序列。
return 1;
return 0;
}
void EnQueue(SqQueue &Q,BiTree e)
{//将元素e插入到队列Q中
if((Q.rear+1)%MAX==Q.front)
exit(0);
Q.base[Q.rear]=e;
Q.rear=(Q.rear+1)%MAX;
}
void DeQueue(SqQueue &Q,BiTree &e)
{
printf("%2c",p->data);
Push(S, p->lchild);
} //向左一直走到尽头
Pop(S,p);//空指针退栈
if(!StackEmpty(S))
{
Pop(S,p);
Push(S, p->rchild);
}
}//while
}//if
}// PreOrderTraverse
Push(S, p->lchild); //向左一直走到尽头
Pop(S, p);//空指针退栈
if(!StackEmpty(S))
{
Pop(S,p);
printf("%2c",p->data);
Push(S, p->rchild);
}//if
}//while
}//if
}// InOrderTraverse
void PostOrderTraverse2(BiTree bt)
{
//非递归对bt进行后序遍历
SqStack S;
BiTree p,q;
InitStack(S);
Push(S,bt);//根指针进栈
while(!StackEmpty(S))
{
while(GetTop(S,p)&&p) //栈顶元素非空
{//将非空队列Q的队头元素出队列
if(Q.front==Q.rear)
exit(0);
e=Q.base[Q.front];
Q.front=(Q.front+1)%MAX;
}
//int n0,n;//n0统计叶子结点数,n统计总的结点数
void PreCreatBiTree(BiTree &bt)
{//按照先序建立二叉树的二叉链表"#"表示虚结点
b.求所有叶子及结点总数。
实验步骤:
#include <stdio.h>
#include <stdlib.h>
#define MAX 10
#define STACK_INIT_SIZE 40 //存储空间初始分配量
#define STACKINCREMENT 10 //存储空间分配增量
typedef struct BiTNode
LeverlOrderTraverse(bt);
printf("\n叶子结点是\n");
PutOutLeaf(bt);
CountNodes(bt,n);
printf("\n结点总数是:%d",n);
printf("\n");
}实验运行结果
教师批阅评语:
成绩评定
教师签名:年月日
优秀
良好
中等
及格
不及格
{//利用递归算法中序遍历一个二叉树
if(bt)
{
InOrderTraverse1(bt->lchild);
printf("%2c",bt->data);
InOrderTraverse1(bt->rchild);
}
}
void PreOrderTraverse1(BiTree bt)
{//递归算法对二叉树进行先序便利
if(bt)
{
printf("%2c",bt->data);
PreOrderTraverse1(bt->lchild);
PreOrderTraverse1(bt->rchild);
}
}
void PostOrderTraverse1(BiTree bt)
{//利用递归后序遍历二叉树
if(bt)
{
PostOrderTraverse1(bt->lchild);