1. 程式人生 > >資料結構複習——二叉樹的表示及遍歷

資料結構複習——二叉樹的表示及遍歷

一、常用概念

1.一棵有N個結點的樹有N-1條邊

2.結點的度:結點的子樹個數

3.樹的度:樹的所有結點中最大的度數

4.一棵樹採用  firstChild-nextSibling 表示方法可以轉換為二叉樹

5.二叉樹的子樹有左右之分,二叉樹有5中基本形式

6.滿二叉樹:深度為k,共有2^k-1個結點

7.完全二叉樹:按序號對應

二、二叉樹遍歷

typedef struct treeNode * PTree;
struct treeNode{	//樹的結點定義
	int Data;
	PTree Left;
	PTree Right;
};

/*
*二叉樹的遍歷
*/

/*  --------------------遞迴遍歷-----------------------------*/

//遞迴前序遍歷
void preTravel(PTree tree){
	if(tree){
		printf("%d ", tree->Data);
		preTravel(tree->Left);
		preTravel(tree->Right);
	}
}

//遞迴中序遍歷
void inTravel(PTree tree){
	if(tree){
		inTravel(tree->Left);
		printf("%d ", tree->Data);
		inTravel(tree->Right);
	}
}

//遞迴後序遍歷
void afterTravel(PTree tree){
	if(tree){
		afterTravel(tree->Left);
		afterTravel(tree->Right);
		printf("%d ", tree->Data);
	}
}

/*  --------------------非遞迴遍歷-----------------------------*/

//非遞迴中序遍歷

void inTravel2(PTree tree){
	PStack s = initStack();		//初始化一個空棧
	PTree t;
	while(t || !isEmpty(s)){
		while(t){
			push(s, t);
			t = t->Left;
		}
		if(!isEmpty(s)){
			t = pop(s);
			printf("%d ", t->Data);
			t = t->Right;
		}
	}
}

//非遞迴先序遍歷

//非遞迴中序遍歷

void preTravel2(PTree tree){
	PStack s = initStack();		//初始化一個空棧
	PTree t;
	while(t || !isEmpty(s)){
		while(t){
			printf("%d ", t->Data);
			push(s, t);
			t = t->Left;
		}
		if(!isEmpty(s)){
			t = pop(s);
			t = t->Right;
		}
	}
}