课程名称:数据结构实验
实验项目:二叉树的创建及遍历
姓名:
专业:计算机科学与技术
班级:
学号:
计算机科学与技术学院
20 17年11 月22 日
哈尔滨理工大学计算机科学与技术学院实验报告
实验项目名称:二叉树的建立及遍历
一、实验目的
1.熟悉掌握课本二叉树相关理论知识
2.实践与理论相结合,掌握二叉树的应用程序
3.学会二叉树的创建,遍历等其他基本操作的代码实现
二、实验内容
1.二叉树的创建代码实现
2.二叉树先序、中序、后序遍历代码实现
三、实验操作步骤
1.二叉树的建立
(1)树节点的定义
由于每个节点都由数据域和指左子树和右子树的指针,故结构体封装如下:
typedef struct node
{
int data;
struct node *left;
struct node *right;
}Tree,*bitree;
(2)建立
采用递归的思想,先建立根再建立左子树,再建立右子树。
递归截止条件子树为空,用-1代表树空
*T=(struct node *)malloc(sizeof(struct node));
(*T)->data=a;
printf("%d的左节点",a);
create(&(*T)->left);
printf("%d的右节点",a);
create(&(*T)->right);
2.三种遍历的实现
(1)先序遍历
依旧采用递归的思想,先遍历根后遍历左子树再遍历右子树。
printf("%d ",T->data);
Pro(T->left);
Pro(T->right);
(2)中序遍历
先遍历左子树再遍历根最后遍历右子树
Mid(T->left);
printf("%d ",T->data);
Mid(T->right);
(3)后序遍历
先遍历左子树再遍历右子树最后遍历根
Later(T->left);
Later(T->right);
printf("%d ",T->data);
(4)按层遍历
按层遍历采用队列的思想,先将第一个节点入队然后在将其出队将其左右孩子入队。
依
次做下去,当队列为空时截止。
t=chudui(q);
printf("%d ",t->data); if(t->left!=NULL)
{ enter(q,t->left); } if(t->right!=NULL)
{enter(q,t->right); } 四、实验结果与分析
我们以如下树做作为实验结果的验证
五、主要代码如下
typedef struct node
{
int data;
struct node *left;
struct node *right;
}Tree,*bitree;
int create(Tree **T)//树的创建
{
int a;
scanf("%d",&a);
if(a==-1)
{
*T=NULL;
return 0;
}
else
{
*T=(struct node *)malloc(sizeof(struct node)); (*T)->data=a;
printf("%d的左节点",a);
create(&(*T)->left);
printf("%d的右节点",a);
create(&(*T)->right);
}
return 1;
}
void Pro(Tree *T)//先序遍历
{
if(T==NULL)
return;
else
{
printf("%d ",T->data);//先访问根
Pro(T->left);//访问左子树
Pro(T->right);//访问右子树
}
}
void Mid(Tree *T)//中序遍历
{
if(T==NULL)
return;
else
{
Mid(T->left);//先访问左子树
printf("%d ",T->data);//访问根
Mid(T->right);
}
}
void Later(Tree *T)//后序遍历
{
if(T==NULL)
return;
else
{
Later(T->left);//先访问左子树
Later(T->right);//访问右子树
printf("%d ",T->data);//访问根
}
}
void ceng(bitree T)
{
Squeue q;
q.rear=0;
q.front=0;
if(T==NULL)
{
printf("这是一棵空树");
return;
}
enter(q,T);//将第一节点入队
Tree *t;
while(q.rear!=q.front)//队列为空跳出
{
t=chudui(q);//出队
printf("%d ",t->data);
if(t->left!=NULL)
{
enter(q,t->left);//将左孩子入队
}
if(t->right!=NULL)
{
enter(q,t->right);//将右孩子入队 }
}
}。