1. 程式人生 > >c語言二叉樹的建立,遍歷,求根的深度,葉子節點的個數

c語言二叉樹的建立,遍歷,求根的深度,葉子節點的個數

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