二叉樹的四種遍歷函數

二叉樹

二叉樹結構定義如下

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

四種遍歷方式分別是 中序先序後序層序

具體例子如下:

二叉樹圖解:
在這裏插入圖片描述
四種遍歷輸出:

Inorder: D B E F A G H C I   //中序
Preorder: A B D F E C G H I   //先序
Postorder: D E F B H G I C A   //後序
Levelorder: A B C D F G I E H   //層序

先序,中序,後序

都是用遞歸輸出,只是根,左節點,右節點的輸出順序不一樣

void InorderTraversal( BinTree BT ){//中序
    if(!BT)
        return;
    InorderTraversal(BT->Left);
    printf(" %c",BT->Data);
    InorderTraversal(BT->Right);
}
void PreorderTraversal( BinTree BT ){ //先序
    if(!BT)
        return;
    printf(" %c",BT->Data);
    PreorderTraversal(BT->Left);
    PreorderTraversal(BT->Right);
}
void PostorderTraversal( BinTree BT ){//後序
    if(!BT)
        return;
    PostorderTraversal(BT->Left);
    PostorderTraversal(BT->Right);
    printf(" %c",BT->Data);
}

層序

需要定義兩個數組存節點,一個存當前節點並輸出data,另一個存這個節點下的左右節點。

void LevelorderTraversal( BinTree BT ){//層序
    if(!BT)
        return;
    int len=1,pos;
    BinTree a[101],b[101];
    a[0]=BT;
    while(1){
        if(len==0)
            return;
        pos=0;
        for(int i=0;i<len;i++)
        {
            if(a[i]!=NULL)//不爲空輸出
                printf(" %c",a[i]->Data);
            if(a[i]->Left!=NULL)//如果它的左節點不爲空,就存到b數組裏
                b[pos++]=a[i]->Left;
            if(a[i]->Right!=NULL)//如果它的右節點不爲空,就存到b數組裏
                b[pos++]=a[i]->Right;
        }
        len=pos;//更新下一層寬度,爲下一次循環做準備
        for(int i=0;i<len;i++)//將下層的b賦給a,爲下一次循環做準備
            a[i]=b[i];
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章