本人c語言小白一枚,近期在學習數據結構(c語言版),特寫此隨筆,做一些總結和分享,如有不當之處,請各位技術大牛指點
首先我們用一個結構體來抽象樹的結點,代碼如下(這里我們存放的數據為char型,大家可以根據自己不同的數據來自己定義,也可以在一開始用typedef特別定義一個類型,接下來就是兩個指針,
用來指向左兒子和右兒子)
struct tnode{ char data; struct tnode *lchild,*rchild; };
一,如何前序創建一顆二叉樹
首先簡述一下前序創建二叉樹的算法:其實前序創建一顆二叉樹的算法非常簡單,這里我們要用到遞歸的思想,先給根節點賦值,然后再依次給左子樹的根節點和右子樹的根節點賦值,用遞歸的思想將整顆樹賦值。(在這里我們用‘#’來表示某個結點為空),代碼如下:
struct tnode * creatTree(struct tnode *head){ char e; scanf("%c",&e); fflush(stdin); if(e != '#'){ head = (struct tnode *)malloc(sizeof(struct tnode));//先開辟空間 head ->data = e;//判斷不是'#'后,給根節點賦值 head ->lchild = NULL; head ->rchild = NULL;
//依次把左兒子和右兒子調用該方法進行賦值 head ->lchild = creatTree(head->lchild); head ->rchild = creatTree(head->rchild); } return head; }
這樣我們就可以成功創建一顆二叉樹
二,前序遍歷二叉樹
簡述一下前序遍歷二叉樹的算法:(這里同樣也要用到遞歸的思想),首先拜訪頭結點,然后拜訪左子樹,再拜訪右子樹,代碼如下:
void preorderTree(struct tnode *head){ //先拜訪頭結點 printf("%c",head->data); //再走左子樹 if(head->lchild != NULL){//判斷左子樹是不是為空 preorderTree(head->lchild); } if(head ->rchild !=NULL){//判斷右子樹是不是為空 //再走右子樹 preorderTree(head->rchild); } return; }
三,后序遍歷二叉樹:
和前序遍歷二叉樹類似,只是我們要最后拜訪根節點,同樣用到了遞歸的思想,代碼如下:
void postorderTree(struct tnode *head){ //先左子樹 if(head->lchild != NULL){ postorderTree(head->lchild); } //再右子樹 if(head->rchild != NULL){ postorderTree(head->rchild); } //最后根節點 printf("%c",head->data); return; }
四,中序遍歷二叉樹:
和前兩種類似,我們先拜訪左子樹,再拜訪根節點,最后拜訪右子樹,(同樣用到了遞歸的思想)代碼如下:
void inorderTree(struct tnode *head){ //先走左子樹 if(head->lchild !=NULL){ inorderTree(head->lchild); } //再走頭結點 printf("%c",head->data); //再走右子樹 if(head->rchild != NULL){ inorderTree(head->rchild); } return; }
五,輸出節點的個數
思路:我們先在main函數里面定義一個計數器,在遍歷的過程中,只要節點不是null,我們就讓這個計數器++,這樣就可以實現記錄節點個數的功能啦,(在這里我們同樣又用到了遞歸的思想,遞歸真的好重要的,到處都是遞歸),代碼如下:(這里特別要注意的地方就是我們在main函數里面定義的計數器,一定要把地址給我們的函數,所以我們函數里面的形參是個int型的指針)
int sumNode(struct tnode *head,int *count){ if(head == NULL){//判斷根節點是否為空 return *count + 0; }else{ //在這里我們用的是前序遍歷二叉樹的思想,先走根節點,在走左右子樹 *count += 1; sumNode(head->lchild,count); sumNode(head->rchild,count); } return *count; }
六,輸出葉子節點的個數
int leaf(struct tnode * root) { if (root == NULL)//如果根節點為空,則返回空 return 0; else if (root->lchild == NULL&&root->rchild == NULL)//如果左孩子和右孩子同時為空,則葉子節點的數加+1 return 1; else return leaf(root->lchild) + leaf(root->rchild);//一棵樹的葉子節點由它的左孩子和右孩子的葉子節點決定的。 }
以上就是全部內容,如有疑問和您的寶貴建議,盡情可以在評論中留言
---恢復內容結束---