1. 程式人生 > >(程式設計訓練)再回首,資料結構——二叉樹的前序、中序、後序遍歷(遞迴)

(程式設計訓練)再回首,資料結構——二叉樹的前序、中序、後序遍歷(遞迴)

       最近在複習資料結構,順便看看大一的時候寫的程式碼,看完之後比當初有了更加深刻的體會。


       希望這些能提供給初學者一些參考。

      在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;
}


執行結果