最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。
希望这些能提供给初学者一些参考。
在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; }
运行结果
(编程训练)再回首,数据结构——二叉树的前序、中序、后序遍历(递归)
原文地址:http://blog.csdn.net/u011694809/article/details/45668991