分別採用遞迴和非遞迴方式編寫兩個函式,求一棵二叉樹中葉子節點個數
阿新 • • 發佈:2019-02-09
#include #include #define MAXSIZE 50 typedef char datatype; typedef struct node { datatype data; struct node *lchild,*rchild; } bintnode,*bintree; //用來存放非遞迴統計葉節點的根節點 typedef struct { bintree a[MAXSIZE]; int top; } stack; void inputbint(bintree *root) { datatype in; scanf("%c",&in); if(in=='#') { *root=NULL; return; } *root=(bintree)malloc(sizeof(bintnode)); if(*root==NULL)return; (*root)->data=in; inputbint(&(*root)->lchild); inputbint(&(*root)->rchild); return; } //前序遍歷 void printbint(bintree root) { if(root==NULL)return; else { printf("%c",root->data); printbint(root->lchild); printbint(root->rchild); } } void recursion(bintree root,int *l) { if (root!=NULL) { if ((root->lchild==NULL)&&root->rchild==NULL) { (*l)++; } recursion(root->lchild,l); recursion(root->rchild,l); return; } return; } int unrecursion(bintree root) { int l=0; stack s; s.top=0; do { if(root!=NULL) { s.a[s.top]=root; s.top++; root=root->lchild; } else { s.top--; root=s.a[s.top]; if(root->lchild==NULL&&root->rchild==NULL) { l++; } root=root->rchild; } } while(s.top!=0||root!=NULL); return l; } int main() { int l=0;//記錄葉子節點個數 bintree root; printf("請輸入二叉樹,子節點為空請輸#:\n"); inputbint(&root); printbint(root); recursion(root,&l);//遞迴實現 printf("\n(遞迴實現)葉子節點的個數為:%d\n",l); l=0; l=unrecursion(root);//非遞迴實現 printf("\n(非遞迴實現)葉子節點的個數為:%d",l); return 0; }