最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。
希望这些能提供给初学者一些参考。
在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>
#define MAXSIZE 100
typedef char ElemType;
//定义数据结构
typedef struct BNode
{
ElemType data;
bool isFirst;
struct BNode *lchild;
struct BNode *rchild;
}BTNode, *BinTree;
//定义栈
typedef struct
{
BinTree elem[MAXSIZE];
int top;
}SeqStack;
//建立二叉链表
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)
{
SeqStack s;
s.top=-1;
do
{
while(root!=NULL)
{
++s.top;
if(s.top==MAXSIZE-1)
{
printf("overflow!");
return;
}
s.elem[s.top]=root;
printf("%c ",root->data);
root=root->lchild;
}
if(-1!=s.top)
{
root=s.elem[s.top];
--s.top;
root=root->rchild;
}
}while(s.top!=-1 || root!=NULL);
}
//2.中序遍历
void InOrder (BinTree root)
{
SeqStack s;
s.top=-1;
do
{
while(root!=NULL)
{
++s.top;
if(s.top==MAXSIZE-1)
{
printf("overflow!");
return;
}
s.elem[s.top]=root;
root=root->lchild;
}
if(-1!=s.top)
{
root=s.elem[s.top];
printf("%c ",root->data);
--s.top;
root=root->rchild;
}
}while(s.top!=-1 || root!=NULL);
}
//后序遍历
void PostOrder(BinTree root)
{
SeqStack s;
s.top=-1;
do
{
while(root!=NULL)
{
++s.top;
if(s.top==MAXSIZE-1)
{
printf("overflow!");
return;
}
root->isFirst=true;
s.elem[s.top]=root;
root=root->lchild;
}
if(-1!=s.top)
{
root=s.elem[s.top];
if(root->isFirst&&root->rchild)
{
root->isFirst=false;
root=root->rchild;
}
else
{
printf("%c ",root->data);
--s.top;
root=NULL;
}
}
}while(s.top!=-1 || root!=NULL);
}
//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;
}
运行结果