1. 程式人生 > >分別採用遞迴和非遞迴方式編寫兩個函式,求一棵二叉樹中葉子節點個數

分別採用遞迴和非遞迴方式編寫兩個函式,求一棵二叉樹中葉子節點個數

#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;
}