二叉樹的建立 與 遍歷

#include <stdio.h>
#include <stdlib.h>

//定義一個樹節點的結構
struct treeNode{
	char data;
	struct treeNode *lchild, *rchlid;
};

//創建樹的各個節點
int create_tree(struct treeNode**);
//遍歷二叉樹
int show_tree(struct treeNode*);

int main(){
	//定義一個指向樹節點的指針
	struct treeNode *root;
	//調用創建函數時,傳遞的是root的地址(函數接收的時候只能用指針的指針)
	//這樣做可以直接對節點進行操作,而不用靠返回值來返回一個建好了的樹的根節點
	create_tree(&root);
	//遍歷樹的各個節點,傳遞的是指向樹的根節點的指針,因爲不用對節點做什麼操作,所以傳遞這個指針就可以了
	//遞歸的時候也比較方便,因爲root其實和root->lchild 是一樣的(一個級別的),都是指向節點的指針
	show_tree(root);
	return 0;
}


//創建樹的各個節點
//用二級指針**t來接收主函數傳過來的 &root
int create_tree(struct treeNode**t){
	//給節點負值用的char型變量
	char element;
	//提示輸入節點值
	printf("enter the data(char):");
	//接受之前清一下緩存,以防下一次遞歸的時候把上一次輸入後的“回車”讀進來
	fflush(stdin);
	//接收
	scanf("%c",&element);
	//這一句很重要,這是遞歸能夠結束的條件,把一個節點的左右孩子都負值成#,則遞歸結束
	//建立樹的時候心裏得有數,算着點建立到什麼節點了
	if (element == '#'){
		*t = NULL;
	}
	else{
		//給*t分配空間
		(*t) = (struct treeNode*)malloc(sizeof(struct treeNode));
		//下面三句的順序決定了是 前/中/後 序建立樹
		//這裏是前序建立
		(*t)->data = element;
		create_tree(&(*t)->lchild);
		create_tree(&(*t)->rchlid);
	}
	//返回
	//**t將被銷燬,但是它的使命已經完成了,建立樹的過程中,它一直在間接引用着指向數節點的指針
	return 0;
}

//遍歷二叉樹
//遍歷不用對樹節點進行操作,所以直接傳個指針過來就可以了,而且比較方便遞歸,因爲遞歸的參數左孩子有孩子,也都是指針
int show_tree(struct treeNode* t){
	//這句很重要,這也是遞歸結束的條件,當節點爲空時直接返回,不繼續做遞歸了
	//如果沒有這句,將會是無限遞歸下去
	if (t == NULL)
		return 0;
	//這三句的順序同樣決定了是前/中/後序遍歷樹
	//這裏是中序遍歷樹
	show_tree(t->lchild);
	printf("%c", t->data);
	show_tree(t->rchlid);
	//返回,*t將被銷燬,無所謂,反正我們只是用t來挨個指了一遍樹上的每個節點,沒有別的用處
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章