数据结构二叉树的遍历实验上机
一、【实验目的】
1、 了解二叉树的前序、中序、后序和层次序列排列;
2、 将C语言同二叉树的数据结构联系起来;
3、 掌握生成的二叉树的链表结构;
4、 掌握如何按层次输出二叉树的所有结点;
5、 掌握如何将动态二叉树转换为静态二叉链表。
二、【实验内容】
创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段:data,lchild,rchild。静态二叉链表是用数组作为存储空间,每个数组元素存储二叉树的一个结点,也有三个字段:data,lchild,rchild。lchild和rdhild分别用于存储左右孩子的下标。
三、【实验步骤与要求】
1、实验前的准备
(1)了解二叉树的基本概念;
(2)了解二叉树的基本结构。
2、上机操作
(1)了解二叉树的前序、中序、后序和层次排列;
(2) 将C语言同二叉树的数据结构联系起来;
(3) 掌握生成的二叉树的链表结构;
(4) 掌握如何按层次输出二叉树的所有结点;
(5) 掌握如何将动态二叉树转换为静态二叉链表。
#include<stdio.h>
#include<stdlib.h>
static int length=0;//二叉树结点个数
typedef struct Array//静态二叉链表节点
{
char data;
int lchild; //存左孩子的下标
int rchild; //存右孩子的下标
}Array;
Array Tree[20];//空的静态二叉树
typedef struct BiTNode //动态二叉链表节点
{
char data;
struct BiTNode *lchild,*rchild;//指向左右孩子的指针
}BiTNode,*BiTree;
BiTree CreateBiTree()//按先序构造动态二叉树,空格表示空树
{
char ch;
BiTree T;
scanf("%c",&ch);
if(ch=='#')
T=NULL; //'#'表示空树
else
{
T=(BiTree)malloc(sizeof(BiTNode));
T->data=ch; //为根数据域赋值
T->lchild=CreateBiTree();//为左孩子数据域赋值
T->rchild=CreateBiTree();//为右孩子数据域赋值
}
return T;
}
//先序遍历,递归实现
void PreTraversingBiTree(BiTree T)
{
if(T)
{
printf("%c",T->data);
PreTraversingBiTree(T->lchild);
PreTraversingBiTree(T->rchild);
}
}
//中序遍历,递归实现
void MidTraversingBiTree(BiTree T)
{
if(T)
{
MidTraversingBiTree(T->lchild);
printf("%c",T->data);
MidTraversingBiTree(T->rchild);
}
}
//后序遍历,递归实现
void PostTraversingBiTree(BiTree T)
{
if(T)
{
PostTraversingBiTree(T->lchild);
PostTraversingBiTree(T->rchild);
printf("%c",T->data);
}
}
//求最大层数
int Maxdepth(BiTree T)
{
int left=0,right=0;
if(T)
{
left=Maxdepth(T->lchild); //向左的最大层数
right=Maxdepth(T->rchild); //向右的最大层数
}
return 1+(left>=right?left:right);
}
//层序遍历
void LevelTraversing(BiTree T,int level)//每层从左向右遍历
{
if(T)
{
if(level==1)
{
printf("%c",T->data);
Tree[++length].data=T->data;//层序遍历的同时给静态表赋值
}
else
{
LevelTraversing(T->lchild,--level);
LevelTraversing(T->rchild,level);
}
}
}
void LevelTraversingBiTree(BiTree T)//每层调用遍历函数
{
int i=1;
if(T)
for(i;i<=Maxdepth(T);i++)
LevelTraversing(T,i);
}
void BitreeTransform(BiTree T)//动态二叉树转换为静态二叉树
{
int i,j;
if(T)
{
for(j=1;T->data!=Tree[j].data;j++);//确定T结点的数组下标
if(T->lchild!=NULL)
{
for(i=1;T->lchild->data!=Tree[i].data;i++);
Tree[j].lchild=i; //寻找并确定左孩子结点的数组下标
}
else
Tree[j].lchild=0; //没找到说明没有左孩子
if(T->rchild!=NULL)
{
for(i=1;T->rchild->data!=Tree[i].data;i++);
Tree[j].rchild=i; //寻找并确定右孩子结点的数组下标
}
else
Tree[j].rchild=0; //没找到说明没有右孩子
BitreeTransform(T->lchild);
BitreeTransform(T->rchild);
}
}
int main()
{
printf("请输入数据:\n");
BiTree T;
T=CreateBiTree();
printf("前序遍历:\t");
PreTraversingBiTree(T);printf("\n");
printf("中序遍历:\t\t");
MidTraversingBiTree(T);printf("\n");
printf("后序遍历:\t\t");
PostTraversingBiTree(T);printf("\n");
printf("层序遍历:\t");
LevelTraversingBiTree(T);printf("\n\n");
BitreeTransform(T);
printf("转为静态二叉树后:\n");
printf("index\tlchild\tdata\trchild\n");
for(int j=1;j<=length;j++)
printf("%d\t%d\t%c\t%d\n",j,Tree[j].lchild,Tree[j].data,Tree[j].rchild);
system("pause");
return 0;
}