C語言利用二叉樹的操作實現根據給定的字符串生成二叉樹並前序、中序、後序輸出二叉樹。

 C語言利用二叉樹的操作實現根據給定的字符串生成二叉樹並前序、中序、後序輸出二叉樹。

Description

根據給定的字符串生成二叉樹並前序、中序、後序此二叉樹。

Input

給定一字符串,其中#表示空。

例:上圖輸入爲

HDB#A##C##G#FE###

Output

分別輸出此二叉樹前序、中序和後序。

Sample Input

HDB#A##C##G#FE###

Sample Output

HDBACGFE
BADCHGEF
ABCDEFGH

HINT

 題目如上關於二叉樹的操作,在這裏使用二叉樹的遞歸定義來完成這道題

二叉樹是n個(n>=0)個節點的有限集合,他要麼爲空二叉樹,要麼爲一個根節點和兩棵互不相交的子樹組成。

這兩個子樹分別叫做左子樹和右子樹。

那麼根據題意和二叉樹的定義,我們先定義一個結構體,元素爲:char類型的數據,和兩個自身類型的指針,左子樹指針,和右子樹指針。

#include<stdio.h>
typedef struct node{
    char data;
    struct node *lChild, *rChild;
}BinTree;

想要對二叉樹進行相應的操作,就得先擁有一個二叉樹,裏面存放我們想要的數據。

那麼創建一個二叉樹的構建函數。

BinTree* CreateBinTree(){
    BinTree* bt = NULL;
    char s;
    scanf("%c",&s);

    if(s=='#'){
        bt = NULL;
    }else{
        bt = (BinTree*)malloc(sizeof(BinTree));
        bt->data = s;
        bt->lChild = CreateBinTree();
        bt->rChild = CreateBinTree();
    }
    return bt;
}

當某個子樹沒有數據的時候,我們使用#來代表這個節點的這個子樹沒有數據。bt=NULL會返回給上一層遞歸調用的函數。

接下來就是按照先序,中序,後序的順序進行輸出。其實瞭解二叉樹的這些遍歷順序就知道。

所謂的先序,中序,後序,無非就是遍歷的時候訪問父節點和左子樹節點、右子樹節點的順序不同。導致遞歸函數被調用的先後順序不同。理解這三個順序中的一個,其餘的也就都能理解出來。

   先序,中序,後序代碼如下:

void PreOrder(BinTree* bt)
{
    if(bt!=NULL)
    {
        printf("%c",bt->data);
        PreOrder(bt->lChild);
        PreOrder(bt->rChild);
    }
}
void PostOrder(BinTree* bt)
{
    if(bt!=NULL)
    {
        PostOrder(bt->lChild);
        PostOrder(bt->rChild);
        printf("%c",bt->data);
    }
}
void InOrder(BinTree* bt)
{
    if(bt!=NULL)
    {
        InOrder(bt->lChild);
        printf("%c",bt->data);
        InOrder(bt->rChild);
    }
}

上面就是這些所有的函數,包括按照三種順序遍歷,和生成二叉樹的函數,全部代碼如下:

 #include<stdio.h>
typedef struct node{
    char data;
    struct node *lChild, *rChild;
}BinTree;

BinTree* CreateBinTree(){
    BinTree* bt = NULL;
    char s;
    scanf("%c",&s);

    if(s=='#'){
        bt = NULL;
    }else{
        bt = (BinTree*)malloc(sizeof(BinTree));
        bt->data = s;
        bt->lChild = CreateBinTree();
        bt->rChild = CreateBinTree();
    }
    return bt;
}
void PreOrder(BinTree* bt)
{
    if(bt!=NULL)
    {
        printf("%c",bt->data);
        PreOrder(bt->lChild);
        PreOrder(bt->rChild);
    }
}
void PostOrder(BinTree* bt)
{
    if(bt!=NULL)
    {
        PostOrder(bt->lChild);
        PostOrder(bt->rChild);
        printf("%c",bt->data);
    }
}
void InOrder(BinTree* bt)
{
    if(bt!=NULL)
    {
        InOrder(bt->lChild);
        printf("%c",bt->data);
        InOrder(bt->rChild);
    }
} 

int main(){
    BinTree *p=NULL;
    p = CreateBinTree();
    PreOrder(p);
    printf("\n");
    InOrder(p);
    printf("\n");
    PostOrder(p);
    return 0;
}

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章