1. 程式人生 > >資料結構—二叉樹(C語言實現)

資料結構—二叉樹(C語言實現)

以下所有內容來自網易雲課堂——資料結構(小甲魚版)

對於樹來說,一旦可以指明他的分支數,那麼就可以用連結串列來實現了

二叉樹是應用廣泛的樹,因為現實世界大部分模型都只包含0,1這兩種情況,非常適合用二叉樹

如下:

typedef struct BiNode
{
    char content ;
    struct BiNode *left;
    struct BiNode *right;
}BiNode,*BiTree;

其實就是使用了兩個指標的連結串列

OK,那如何建立二叉樹呢?要先明白二叉樹的遍歷分為前序,中序,後序三種,現在還不太清楚的同學可以去視訊裡面去學一下

這裡只給出按照前序建立的方式(網上說只有前序和後序可以,中序不可以,沒有太思考明白為什麼,如果有懂的朋友,還是希望可以教教我)

以下是一種遞迴的建立方式

void CreateBiTree(BiTree *T)
{
    char receive ;
    scanf("%c",&receive);
    if(receive == '*')
    {
       *T = NULL ;
    }
    else
    {
        *T = (BiTree)malloc(sizeof(BiNode));
        (*T)->content = receive ;
        CreateBiTree(&(*T)->left);
        CreateBiTree(&(*T)->right);
    }
}

先按照前序遍歷輸入二叉樹,如果是空的位置輸入“*”

他的思路是這樣的

假設現在一個公司分蘋果,左子樹是下屬主領導,右子樹是下屬副領導,好吧,當然是主領導比副領導優先

那麼他們的規律是:

老大A拿了一個,給下屬主領導B打電話“來拿蘋果,拿完告訴我,我再給副領導C打”

主領導B拿完,給自己的下屬主領導D打電話“來拿蘋果,拿完告訴我,我再給副領導E打”

...

如果自己是最底層小弟(*號表示),只能說不客氣,告訴上級

自己的小弟都拿完了,那麼就說我和我手下都拿完了,告訴上級

...

(可以理解成從高往低一級一級的部署任務,然後從低往高一級一級的彙報,對於每一層,無非是

自己工作,讓小弟(左)工作,讓小弟(右)工作,然後完成)

對應於安排任務的相應遍歷方式

#define FRONT 1
#define MIDDLE 2
#define BACK 3

// .....

void show(BiTree *T,int TYPE)
{
    if(*T==NULL)
    {
        printf("*");
        return ;
    }
    else
    {
        switch(TYPE)
        {
            ///////just change the order
            case FRONT:
                    printf("%c",(*T)->content);
                    show(&(*T)->left,TYPE);
                    show(&(*T)->right,TYPE);
                    break;
            case MIDDLE:
                    show(&(*T)->left,TYPE);
                    printf("%c",(*T)->content);
                    show(&(*T)->right,TYPE);
                    break;
           case BACK:
                    show(&(*T)->left,TYPE);
                    show(&(*T)->right,TYPE);
                    printf("%c",(*T)->content);
                    break;
        }
        return ;
    }
}
注意看switch處的三種方式,是不是隻是次序變了一下!

其實二叉樹的遍歷就是這樣!。

結合遍歷去看前序建立,你是不是發現這裡的程式碼其實非常的形象?這就是遞迴大法的好處!

休息了