首頁 > 軟體

C語言資料結構二元樹先序、中序、後序及層次四種遍歷

2022-02-11 10:00:03

一、圖示展示

(1)先序遍歷

先序遍歷可以想象為,一個小人從一棵二元樹根節點為起點,沿著二元樹外沿,逆時針走一圈回到根節點,路上遇到的元素順序,就是先序遍歷的結果

先序遍歷結果為:A B D H I E J C F K G

動畫演示:

記住小人沿著外圍跑一圈(直到跑回根節點),多看幾次動圖便能理解

(2)中序遍歷

中序遍歷可以看成,二元樹每個節點,垂直方向投影下來(可以理解為每個節點從最左邊開始垂直掉到地上),然後從左往右數,得出的結果便是中序遍歷的結果

中遍歷結果為:H D I B E J A F K C G

動畫展示:

記住,中序遍歷就是從最左邊開始,把每個節點垂直投影到同一直線上,然後從左往右讀值就可以了,多看幾遍動圖就理解了

(3)後序遍歷

後序遍歷就像是剪葡萄,我們要把一串葡萄剪成一顆一顆的。

還記得我上面提到先序遍歷繞圈的路線麼?(不記得翻上面理解)

就是圍著樹的外圍繞一圈,如果發現一剪刀就能剪下的葡萄(必須是一顆葡萄)(也就是葡萄要一個一個掉下來,不能一口氣掉超過1個這樣),就把它剪下來,組成的就是後序遍歷了。

後序遍歷中,根節點預設最後面

後序遍歷結果:H I D J E B K F G C A

動畫展示:

(4)層次遍歷

層次遍歷很好理解,就是從根節點開始,一層一層,從上到下,每層從左到右,依次寫值就可以了

層次遍歷結果:A B C D E F G H I J K

解釋外圈跑的意思:

繞著外圍跑一整圈的真正含義是:遍歷所有結點時,都先往左孩子走,再往右孩子走。

(5)口訣

先序遍歷: 先根 再左 再右

中序遍歷: 先左 再根 再右

後序遍歷: 先左 再右 再根

這裡的根,指的是每個分叉子樹(左右子樹的根節點)根節點,並不只是最開始頭頂的根節點,需要靈活思考理解,建議畫圖理解!!

二、程式碼展示

#include<stdio.h>
#include<stdlib.h>

typedef struct Tree{
 
 int data;                    //    存放資料域
 struct Tree *lchild;            //    遍歷左子樹指標
 struct Tree *rchild;            //    遍歷右子樹指標
 
}Tree,*BitTree;

BitTree CreateLink()
{
    int data;
    int temp;
    BitTree T;
    
    scanf("%d",&data);        //    輸入資料
    temp=getchar();            //    吸收空格
    
    if(data == -1){            //    輸入-1 代表此節點下子樹不存資料,也就是不繼續遞迴建立
        
        return NULL;

    }else{
        T = (BitTree)malloc(sizeof(Tree));            //        分配記憶體空間
        T->data = data;                                //        把當前輸入的資料存入當前節點指標的資料域中
        
        printf("請輸入%d的左子樹: ",data);        
        T->lchild = CreateLink();                    //        開始遞迴建立左子樹
        printf("請輸入%d的右子樹: ",data);            
        T->rchild = CreateLink();                    //        開始到上一級節點的右邊遞迴建立左右子樹
        return T;                            //        返回根節點
    }    
    
}
//    先序遍歷
void ShowXianXu(BitTree T)            //        先序遍歷二元樹
{
    if(T==NULL)                        //    遞迴中遇到NULL,返回上一層節點
    {
        return;
    }
    printf("%d ",T->data);
    ShowXianXu(T->lchild);            //    遞迴遍歷左子樹
    ShowXianXu(T->rchild);            //    遞迴遍歷右子樹
}
//    中序遍歷
void ShowZhongXu(BitTree T)            //        先序遍歷二元樹
{
    if(T==NULL)                        //    遞迴中遇到NULL,返回上一層節點
    {
        return;
    }
    
    ShowZhongXu(T->lchild);            //    遞迴遍歷左子樹
    printf("%d ",T->data);
    ShowZhongXu(T->rchild);            //    遞迴遍歷右子樹
    
}
//    後序遍歷
void ShowHouXu(BitTree T)            //        後序遍歷二元樹
{
    if(T==NULL)                        //    遞迴中遇到NULL,返回上一層節點
    {
        return;
    }
    
    ShowHouXu(T->lchild);            //    遞迴遍歷左子樹
    ShowHouXu(T->rchild);            //    遞迴遍歷右子樹
    printf("%d ",T->data);
}


int main()
{
    BitTree S;
    printf("請輸入第一個節點的資料:n");
    S = CreateLink();            //        接受建立二元樹完成的根節點
    printf("先序遍歷結果: n");
    ShowXianXu(S);                //        先序遍歷二元樹

    printf("n中序遍歷結果: n");
    ShowZhongXu(S);                //        中序遍歷二元樹
    
    printf("n後序遍歷結果: n");
    ShowHouXu(S);                //        後序遍歷二元樹
    
    return 0;    
}     

到此這篇關於C語言資料結構二元樹先序、中序、後序及層次四種遍歷的文章就介紹到這了,更多相關C語言資料結構遍歷內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com