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