二叉链表的建立、遍历以及生成完全二叉树顺序存储结构
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
知识范畴:树 完成日期:2018年05月05日
实验题目:二叉树的基本算法一(二叉链表的建立、遍历以及生成完全二叉树顺序存储结构) 实验内容及要求:
设二叉树结点数据域为字符类型,从键盘输入先序递归遍历字符序列(用#字符表示NULL 指针域)建立二叉链表存储结构,然后输出其先、中、后序递归遍历结点访问次序以及层次遍历结点访问次序(层次遍历所需队列要求采用循环队列);
建立该二叉树对应的完全二叉树顺序存储结构,输出完全二叉树顺序存储结构(哑元素采用@字符表示)。
如:二叉树如下所示,则输出的完全二叉树顺序结构为:A@B@@C@@@@@@D
实验目的:掌握二叉树二叉链表存储结构的建立、遍历等基本算法。
数据结构设计简要描述:
采用单向链表,每个结点包含字符类型的数据域和两个指针域。
结构如下:
typedef struct node
{
ElemTp data; //数据域
struct node *lchild; //左指针
struct node *rchild; //右指针
}
采用循环队列存放链表中的结点,结构如下: typedef struct
{
ElemType *elem;
int n; //队列容量
int f; //队头指针
int r; //队尾指针
} A
B
C
D
算法设计简要描述:
采用先序遍历的方法建立二叉树。
先序中序后序遍历采用递归算法反复调用自身,当结点为空时结束递归。
层次遍历时将根放入循环队列,然后在循环体中取出队首元素,打印数据域。
再将左右儿子放入队列尾,队空时结束循环。
同时,将层次遍历的结果存入字符串,并记录字符串的做i 后一个字符。
将二叉树转化为完全二叉树时也采用层次遍历的方法,结束条件为从队列取出元素的数据域等于字符串的最后一个字符。
单结点为空时创建结点,并为空结点创建空间,为指针域赋值’@’。
同时输出层次遍历的结果。
输入/输出设计简要描述:
从键盘连续输入字符,字符’#’表示空结点。
单需要创建队列时需手动输入队列的大小。
输出均有文字提示信息。
当队列空间不足时提示队满,并退出程序。
编程语言说明:
使用Visual C++编程。
主要代码采用C语言实现。
输入输出采用scanf和printf函数,动态分配内存空间采用malloc操作符。
编程注释采用C/C++规范。
主要函数说明:
void initQueue(SqQueue &q) //初始化队列
void clearQueue(SqQueue &q) //清空队列
int empty(SqQueue &q) //判断队空
int full(SqQueue &q) //判断队满
int inQueue(SqQueue &q, ElemType e) //队尾入队
int outQueue(SqQueue &q, ElemType &e) //队头出队
BiT crtBT()//用先序遍历算法建立二叉树
void preorder(BiT bt) //先序遍历
void midorder(BiT bt) //中序遍历
void lasorder(BiT bt) //后序遍历
void layertravel(BiT bt,char str1[],int &n) //二叉树按层次遍历
void fullBT(BiT bt,char str1[],int n) //建立完全二叉树并输出
程序测试简要报告:
输入:A#BC#D###
树的结构如下:
先序遍历:ABCD
中序遍历:ACDB
后序遍历:DCBA
层次遍历:ABCD
完全二叉树:A@B@@C@@@@@@D
运行结果如图:
源程序代码:
#include <stdio.h>
#include <stdlib.h>
#define Max_size 100
typedef char ElemTp; //算法假定二叉链表data域为char型
typedef struct node
{
ElemTp data; //数据域
struct node *lchild; //左指针
struct node *rchild; //右指针
}*BiT, BiTNode;
typedef BiT ElemType; //入队元素类型
typedef struct
{
ElemType *elem;
int n; //队列容量
int f; //队头指针
int r; //队尾指针
}SqQueue;
//初始化队列
void initQueue(SqQueue &q)
{
int n;
printf("请输入队列容量n:");
scanf("%d",&n);
q.n = n;
q.r = q.f = -1;//初始化指针
q.elem = (ElemType *)malloc(q.n * sizeof(ElemType)); }
//清空队列
void clearQueue(SqQueue &q)
{
q.r=q.f=-1;
/*r=f=-1~n-1区间的任一
整数均可*/
}
//判断队空
int empty(SqQueue &q)
{
return q.f==q.r;
}
//判断队满
int full(SqQueue &q)
{
return(q.r+1)%q.n==(q.f+q.n)%q.n;
}
//队尾入队
int inQueue(SqQueue &q, ElemType e)
{
if((q.r+1)%q.n==(q.f+q.n)%q.n)
{
printf("队满\n");
exit(0);
//return 0;
}
q.r=(q.r+1)%q.n;
q.elem[q.r]=e;
return 1; //入队成功返回1
}
//队头出队
int outQueue(SqQueue &q, ElemType &e)
{
if(q.r==q.f)
{
printf("队空\n");
exit(0);
//return 0; //队空,出队失败
}
q.f=(q.f+1)%q.n;
e=q.elem[q.f];
return 1; //出队成功返回1
}
//用先序遍历算法建立二叉树
BiT crtBT()
{
char ch;
BiT bt;
scanf("\n");
scanf("%c",&ch);
if(ch=='#') //输入#字符表示NULL指针域
return NULL;
bt=(BiT)malloc(sizeof(BiTNode)); //建立根结点
bt->data=ch;
bt->lchild=crtBT(); //建立左子树
bt->rchild=crtBT(); //建立右子树
return bt; //返回根结点指针
}
//先序遍历
void preorder(BiT bt)
{
if(bt)
{
printf("%c",bt->data);
preorder(bt->lchild);
preorder(bt->rchild);
}
}
//中序遍历
void midorder(BiT bt)
{
if(bt)
{
midorder(bt->lchild);
printf("%c",bt->data);
midorder(bt->rchild);
}
}
//后序遍历
void lasorder(BiT bt)
{
if(bt)
{
lasorder(bt->lchild);
lasorder(bt->rchild);
printf("%c",bt->data);
}
}
//二叉树按层次遍历
void layertravel(BiT bt,char str1[],int &n)
{
if(bt==NULL)
return; //空树直接结束
SqQueue Q;
initQueue(Q); //初始化结点指针队列
inQueue(Q, bt); //根结点指针入队
printf("结果:");
while(!empty(Q))
{
outQueue(Q,bt); //队头元素出队
printf("%c",bt->data);
str1[n++] = bt->data;
if(bt->lchild) inQueue(Q, bt->lchild);
if(bt->rchild) inQueue(Q, bt->rchild);
}
clearQueue(Q);
}
//建立完全二叉树并输出
void fullBT(BiT bt,char str1[],int n)
{
SqQueue Q;
initQueue(Q); //初始化结点指针队列
inQueue(Q, bt); //根结点指针入队
printf("完全二叉树:\n");
while(bt->data != str1[n-1])
{
outQueue(Q,bt); //队头元素出队
if(!bt)
{
bt=(BiT)malloc(sizeof(BiTNode));
bt->data = '@';
bt->lchild = NULL;
bt->rchild = NULL;
}
printf("%c",bt->data);
inQueue(Q, bt->lchild);
inQueue(Q, bt->rchild);
}
printf("\n");
clearQueue(Q);
}
int main()
{
BiT bt;
char str1[Max_size];
int n = 0;
bt = NULL;
printf("请输入字符构建树('#'为空):");
bt = crtBT();
printf("先序遍历:");
preorder(bt);
printf("\n中序遍历:");
midorder(bt);
printf("\n后序遍历:");
lasorder(bt);
printf("\n\n层次遍历:\n");
layertravel(bt,str1,n);
//printf("\n---------------\n");
//printf("str = ");
//str1[n]='\0';
//puts(str1);
//printf("\nn = %d\n",n);
printf("\n---------------\n");
fullBT(bt,str1,n);
//printf("\ncount = %d\n",count);
return 0;
}。