#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;
}
二叉樹的建立 與 遍歷
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.