一、实验要求:
实现二叉树的先序、中序、后序遍历,并将其转换为静态二叉链表。
二、代码实现:
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define N 20
typedef struct BiTNode
{
char data;//结点数据
struct BiTNode *lchild,*rchild;//左右孩子指针
int index;
}*BiTree;
typedef struct StBiTNode
{
char data;
int lchild;
int rchild;
}StBiTree;
static int i=0;
//创建二叉树
void CreateBiTree(BiTree *T)
{
char ch;
scanf("%c",&ch);
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
if(!*T)
exit(-1);
(*T)->data=ch;//生成根结点
(*T)->index=i++;
CreateBiTree(&(*T)->lchild);//构造左子树
CreateBiTree(&(*T)->rchild);//构造右子树
}
}
//先序遍历二叉树
void PreOrderTraverse(BiTree T)
{
if(T==NULL)
return;
printf("%c",T->data);//显示结点数据
PreOrderTraverse(T->lchild);//再先序遍历左子树
PreOrderTraverse(T->rchild);//最后先序遍历右子树
}
//中序遍历二叉树
void InOrderTraverse(BiTree T)
{
if(T==NULL)
return;
InOrderTraverse(T->lchild);//中序遍历左子树
printf("%c",T->data);//显示结点数据
InOrderTraverse(T->rchild);//最后中序遍历右子树
}
//后序遍历二叉树
void PostOrderTraverse(BiTree T)
{
if(T==NULL)
return;
PostOrderTraverse(T->lchild);//先后序遍历左子树
PostOrderTraverse(T->rchild);//再后序遍历右子树
printf("%c",T->data);//显示结点数据
}
static int j=0;
void turn(BiTree T,StBiTNode a[])//将动态二叉树转换成静态二叉链表
{
if(T)
a[j].data=T->data;
if(T->lchild==NULL)
a[j].lchild=-1;
else
a[j].lchild=T->lchild->index;
if(T->rchild==NULL)
a[j].rchild=-1;
else
a[j].rchild=T->rchild->index;
j++;
if(T->lchild!=NULL)
turn(T->lchild,&a[0]);
if(T->rchild!=NULL)
turn(T->rchild,&a[0]);
}
int main()
{
BiTNode *BiTree;
StBiTNode a[N];
printf("请输入二叉树的结点数据,当为空时用#代替:");
CreateBiTree(&BiTree);
printf("\n");
printf("先序遍历:");
PreOrderTraverse(BiTree);
printf("\n");
printf("中序遍历:");
InOrderTraverse(BiTree);
printf("\n");
printf("后序遍历:");
PostOrderTraverse(BiTree);
printf("\n\n");
turn(BiTree,&a[0]);
printf("转换为静态二叉链表(-1表示为空):\n");
printf("i\tdata\tlchild\trchild\t\n");
int m;
for(m=0;m<i;m++)
printf("%d\t%c\t%d\t%d\n",m,a[m].data,a[m].lchild,a[m].rchild);
return 0;
}
三、实验测试
测试用例:
运行结果: