实验四 二叉树的创建与遍历
一、实验目的
1、掌握二叉树的二叉链表存储结构;
2、掌握利用二叉树的先序遍历方法创建一个二叉树;
3、掌握二叉树遍历的递归实现方法,掌握利用队列“先进先出”的结构特点实现层序遍历。
二、实验内容
按扩展先序遍历序列输入二叉树中结点的值,(用‘#’表示空),构造一棵二叉树;
以递归算法实现二叉树的先序、中序、后序遍历;
实现二叉树的层次遍历(采用队列实现)。
三、实验步骤和设计思想
1、按扩展先序遍历序列输入二叉树中结点的值,(构造一棵二叉树;
2、以递归算法实现二叉树的先序、中序、后序遍历;
3、用队列实现实现二叉树的层次遍历
四、实验代码
#include<stdio.h>
#include<stdlib.h>
typedef char TElemType;
typedef struct BiTnode
{ TElemType data; /*保存树结点的数据元素,比如字符A、B、C等*/
struct BiTnode *lchild, *rchild; //左右子树的指针
} BiTnode,*BinTree;
#define QueueSize 50 //定义队列的最大容量
typedef struct
{
BiTnode *data[QueueSize]; /*保存队中元素*/
int front,rear; /*队头和队尾指针,队头指向队列首元素的前一个位置,队尾指向队尾元素。*/
} SqQueue;
void CreateBinTree(BinTree *tree){//根据所有序列创建二叉树
char C;
scanf("%c",&C);
if(C== '#'){
(*tree) = NULL;
}
else{
*tree=(BinTree)malloc(sizeof(BiTnode));
(*tree)->data=C;
CreateBinTree(&((*tree)->lchild));
CreateBinTree(&((*tree)->rchild));
}
}
void Preorder(BinTree T){//先序遍历
if(T){
printf("%c ",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
void Inorder(BinTree T){//中序遍历
if(T){
Inorder(T->lchild);
printf("%c ",T->data);
Inorder(T->rchild);
}
}
void Postorder(BinTree T){//后序遍历
if(T){
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c ",T->data);
}
}
/*初始化队列*/
void InitQueue(SqQueue *&q)
{
q=(SqQueue*)malloc(sizeof(SqQueue));
q->front=q->rear=0;
}
/*销毁队列*/
void DestroyQueue(SqQueue *q)
{
free(q);
}
/*判断队列是否为空*/
bool QueueEmpty(SqQueue *q)
{
return (q->front==q->rear);
}
//入队列
bool enQueue(SqQueue*& q, BiTnode*& BT) {
if (q->rear ==QueueSize- 1) { //判断队列是否满了
return false; //返回假
}
q->rear++; //头指针加 1
q->data[q->rear] = BT; //传值
return true; //返回真
}
//出队列
bool deQueue(SqQueue*& q, BiTnode*& BT) {
if (q->front==q->rear) { //判断是否空了
return false; //返回假
}
q->front++; //尾指针加 1
BT = q->data[q->front]; //取值
return true; //返回真
}
void LevelOrder(BinTree b)
{
BinTree p;
SqQueue *qu;
InitQueue(qu);
enQueue(qu,b);
while (!QueueEmpty(qu)){
deQueue(qu,p);
printf("%c ",p->data);
if(p-> lchild!= NULL)
enQueue(qu,p -> lchild);
if (p-> rchild!= NULL)
enQueue(qu,p -> rchild) ;
}
DestroyQueue(qu);
}
int main(){
BinTree T = NULL;
printf("请输入您要建立的二叉树的先序扩展序列(用#表示空)\n");
CreateBinTree(&T);
printf("构造二叉树成功!\n");
printf("先序遍历:\n");
Preorder(T);
printf("\n");
printf("中序遍历:\n");
Inorder(T);
printf("\n");
printf("后序遍历:\n");
Postorder(T);
printf("\n");
printf("层次遍历:\n");
LevelOrder(T);
}