c語言二叉樹的建立,遍歷,求根的深度,葉子節點的個數
阿新 • • 發佈:2019-02-13
#include <stdio.h> #include <stdlib.h> typedef struct node { char data; struct node *rchild,*lchild; }node,*linklist; void preorder_create(linklist *l)//先序建立二叉樹 { char ch,temp; scanf("%c",&ch); temp=getchar(); if(ch=='#') { *l=NULL; } else { (*l)=(node*)malloc(sizeof(node)); (*l)->data=ch;//每個節點進去都要進行下面兩個遞迴,即輸入左子節點和右子節點,而每個內部遞迴也要進行 printf("請輸入%c的左子節點\n",ch); preorder_create(&((*l)->lchild));//*l->rchild當於進行上面的操作、當a的子節點變成#時,這個遞迴退出,進行下一個遞迴,即下一語句 printf("請輸入%c的右子節點\n",ch); preorder_create(&((*l)->rchild));//當*l->lchild不為#時一直進行該遞迴,直到滿足條件,退出遞迴,結束該函式 } } void preorder_traverse(linklist *l)//先序遍歷輸出 { if((*l)==NULL) { return; } printf("%4c",(*l)->data);//從頭結點開始,進行左右遞迴,左右遞迴的內部再繼續進行 preorder_traverse(&((*l)->lchild));//每個內部也要進行左右兩個遞迴 preorder_traverse(&((*l)->rchild)); } void inorder_traverse(linklist *l)//中序遍歷輸出 { if((*l)==NULL) { return; } inorder_traverse(&((*l)->lchild)); printf("%4c",(*l)->data); inorder_traverse(&((*l)->rchild)); } void postorder_traverse(linklist *l)//後序遍歷輸出 { if((*l)==NULL) { return; } postorder_traverse(&((*l)->lchild)); postorder_traverse(&((*l)->rchild)); printf("%4c",(*l)->data); } int TreeDeep(linklist *l)//求二叉樹的深度 { int deep=0; if(*l) { int leftdeep=TreeDeep(&((*l)->lchild)); int rightdeep=TreeDeep(&((*l)->rchild)); deep=leftdeep>=rightdeep?leftdeep+1:rightdeep+1; } return deep; } int life_count(linklist *l)//求葉子節點的個數 { static int num=0; if((*l)==NULL)//此遞迴方式與上面相同,保持整個遞迴可以正常執行 { return; } else { if(((*l)->lchild)==NULL&&((*l)->rchild)==NULL)//對遞迴的每個節點進行判斷,成立累加 { num++; } life_count(&((*l)->lchild)); life_count(&((*l)->rchild)); } return num;//return語句表示整個函式的最終結果為一個值,可以通過變數賦給 } int main() { linklist a; preorder_create(&a); preorder_traverse(&a); inorder_traverse(&a); int deepth,num; deepth=TreeDeep(&a); printf("%d",deepth); num=life_count(&a); printf("%d",num); //postorder_traverse(&a); return 0; }