1. 程式人生 > >嚴蔚敏 資料結構 二叉樹鏈式儲存結構 遍歷等操作

嚴蔚敏 資料結構 二叉樹鏈式儲存結構 遍歷等操作

課本 《資料結構(C語言版)(第2版)》 嚴蔚敏版

樹結構的學習。

編譯環境:DEV C++

檔案格式為 cpp(c++檔案型別),前者的引用函式,在 C 的情況下沒完成。

實現:

二叉樹的先序遍歷建立,三種遍歷方法,葉子節點的查詢等。

參考 code: 

#include <stdio.h>
#include <stdlib.h>
#define Shyazhut 0//條件啟用求葉子節點的函式:0 不使用
const int MYDD = 1103;

typedef struct BiTNode {
	char data;//節點資料域
	struct BiTNode *lc, *rc;//節點左右孩子
} BiTNode, *BiTree;

void CreatBiTree(BiTree &T);
void InitBiTree(BiTree &T);
void PreorderTraversal(BiTree T);//先序遍歷
void InOrderTraveres(BiTree T);//中序遍歷
void PostTraversing(BiTree T);//後序遍歷
int GetLeaves(BiTree T);//求葉子節點
int LeavesSum = 0;//全域性變數葉子節點統計

int main() {
	int i,n;
	BiTree T;
	InitBiTree(T);
	CreatBiTree(T);

	puts("\n先序遍歷二叉樹的結果:");
	PreorderTraversal(T);

	puts("\n\n中序遍歷二叉樹的結果:");
	InOrderTraveres(T);

	puts("\n\n後序遍歷二叉樹的結果:");
	PostTraversing(T);

	printf("\n\n葉子節點的個數有 %d 個(先序遍歷中求得).\n", LeavesSum);
	
#if Shyazhut
	printf("葉子節點的個數有 %d 個(求葉子節點函式求得).\n", GetLeaves(T));
#endif

	free(T);
	return 0;
}

void InitBiTree(BiTree &T) {//節點初始化
	T = (BiTNode*)malloc(sizeof(BiTNode));//malloc()的返回值可以強制型別轉換
	T -> lc = NULL;
	T -> rc = NULL;
	printf("請以先序的方式鍵入二叉樹節點資訊。\n");
}

void CreatBiTree(BiTree &T) {//先序遍歷的方式構造二叉樹
	char ch;
	scanf("%c", &ch);
	if(ch == '#')
		T = NULL;
	else {
		T=(BiTNode*)malloc(sizeof(BiTNode));
		if(!T) return;
		T -> data = ch;
		CreatBiTree(T->lc);
		CreatBiTree(T->rc);
	}
}

/*三種遍歷*/
void PreorderTraversal(BiTree T) {
	if(T==NULL)	return;
	printf("%c ", T -> data);
	if((T -> lc == NULL) && (T -> rc == NULL)) LeavesSum++;//葉子節點的統計

	PreorderTraversal(T->lc);
	PreorderTraversal(T->rc);
}

void InOrderTraveres(BiTree T) {
	if(T == NULL)	return;
	InOrderTraveres(T -> lc);
	printf("%c ", T -> data);
	InOrderTraveres(T -> rc);
}

void PostTraversing(BiTree T) {
	if(T == NULL)	return;
	PostTraversing(T -> lc);
	PostTraversing(T -> rc);
	printf("%c ", T -> data);
}

#if Shyazhut
int GetLeaves(BiTree T) {//葉子節點的統計
	if(!T) {
		LeavesSum += GetLeaves(T -> lc);
		if((T -> lc == NULL) && (T -> rc == NULL)) LeavesSum++;
		LeavesSum += GetLeaves(T -> rc);
	}
	return LeavesSum;
}
#endif

/*
測試資料
ABC##DE#G##F###


*/