(程式設計訓練)再回首,資料結構——二叉樹的前序、中序、後序遍歷(遞迴)
阿新 • • 發佈:2019-02-12
最近在複習資料結構,順便看看大一的時候寫的程式碼,看完之後比當初有了更加深刻的體會。
希望這些能提供給初學者一些參考。
在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; }
執行結果