最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。
希望这些能提供给初学者一些参考。
在VC++6.0下可运行,当初还写了不少注释。
【问题描述】
根据顺序存储结构建立二叉树的二叉链表,并对二叉树进行先序、中序、后序遍历。
【基本要求】
·功能:根据顺序存储结构建立二叉树的二叉链表,并进行先序、中序、后序遍历。
·输入:输入二叉树的顺序存储。
·输出:二叉树的先序、中序、后序遍历序列。
【测试数据】
输入二叉树的顺序存储,给出每个结点的序号和值,
1A↙
2B↙
3C↙
4D↙
6E↙
7F↙
9G↙
12H↙
14I↙
15J↙
00↙
预期的输出为据此建立的二叉树的
先序序列:ABDGCEHFIJ,
中序序列:DGBAHECIFJ,
后序序列:GDBHEIJFCA。
【模块划分】
一共设计四个模块
(1) 建立二叉链表CreateBT();
(2) 先序遍历二叉树PreOrder():
(3) 中序遍历二叉树InOrder():
(4) 后序遍历二叉树PostOrder():
/*二叉树遍历*/
#include <stdio.h>
#include <malloc.h>
typedef char ElemType;
//定义数据结构
typedef struct BNode
{
ElemType data;
struct BNode *lchild;
struct BNode *rchild;
}BTNode, *BinTree;
//建立二叉链表
BinTree CreatBT()
{
BTNode *q,*ptr[20];
int i,j;
ElemType x;
BinTree root=NULL;
scanf("%d%c",&i,&x);
getchar();
while(x!=' ')
{
q=(BTNode*)malloc(sizeof(BTNode));
q->data=x;
q->lchild=NULL;
q->rchild=NULL;
ptr[i]=q;
if(1==i)
root=q;
else
{
j=i/2;
if(!(i%2))
//左子树
ptr[j]->lchild=q;
else
//右子树
ptr[j]->rchild=q;
}
scanf("%d%c",&i,&x);
getchar();
}
return root;
}
//先序遍历
void PreOrder(BinTree root)
{
if(root!=NULL)
{
printf("%c ",root->data);
PreOrder(root->lchild);
PreOrder(root->rchild);
}
}
//中序遍历
void InOrder(BinTree root)
{
if(root!=NULL)
{
InOrder(root->lchild);
printf("%c ",root->data);
InOrder(root->rchild);
}
}
//后序遍历
void PostOrder(BinTree root)
{
if(root!=NULL)
{
PostOrder(root->lchild);
PostOrder(root->rchild);
printf("%c ",root->data);
}
}
//main函数
int main(void)
{
BinTree root;
root=CreatBT();
printf("先序遍历\n");
PreOrder(root);
printf("\n");
printf("中序遍历\n");
InOrder(root);
printf("\n");
printf("后序遍历\n");
PostOrder(root);
printf("\n");
return 0;
}
运行结果