二叉樹層次遍歷及其C語言實現


前邊介紹了二叉樹的先序、中序和后序的遍歷算法,運用了棧的數據結構,主要思想就是按照先左子樹后右子樹的順序依次遍歷樹中各個結點。

本節介紹另外一種遍歷方式:按照二叉樹中的層次從左到右依次遍歷每層中的結點。具體的實現思路是:通過使用隊列的數據結構,從樹的根結點開始,依次將其左孩子和右孩子入隊。而后每次隊列中一個結點出隊,都將其左孩子和右孩子入隊,直到樹中所有結點都出隊,出隊結點的先后順序就是層次遍歷的最終結果。


圖1 二叉樹

層次遍歷的實現過程

例如,層次遍歷圖 1 中的二叉樹:

  • 首先,根結點 1 入隊;
  • 根結點 1 出隊,出隊的同時,將左孩子 2 和右孩子 3 分別入隊;
  • 隊頭結點 2 出隊,出隊的同時,將結點 2 的左孩子 4 和右孩子 5 依次入隊;
  • 隊頭結點 3 出隊,出隊的同時,將結點 3 的左孩子 6 和右孩子 7 依次入隊;
  • 不斷地循環,直至隊列內為空。

實現代碼

#include <stdio.h>
#define TElemType int
//初始化隊頭和隊尾指針開始時都為0
int front=0,rear=0;

typedef struct BiTNode{
    TElemType data;//數據域
    struct BiTNode *lchild,*rchild;//左右孩子指針
}BiTNode,*BiTree;
void CreateBiTree(BiTree *T){
    *T=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->data=1;
    (*T)->lchild=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->rchild=(BiTNode*)malloc(sizeof(BiTNode));
   
    (*T)->lchild->data=2;
    (*T)->lchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->lchild->rchild=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->lchild->rchild->data=5;
    (*T)->lchild->rchild->lchild=NULL;
    (*T)->lchild->rchild->rchild=NULL;
   
    (*T)->rchild->data=3;
    (*T)->rchild->lchild=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->rchild->lchild->data=6;
    (*T)->rchild->lchild->lchild=NULL;
    (*T)->rchild->lchild->rchild=NULL;
   
    (*T)->rchild->rchild=(BiTNode*)malloc(sizeof(BiTNode));
    (*T)->rchild->rchild->data=7;
    (*T)->rchild->rchild->lchild=NULL;
    (*T)->rchild->rchild->rchild=NULL;
   
    (*T)->lchild->lchild->data=4;
    (*T)->lchild->lchild->lchild=NULL;
    (*T)->lchild->lchild->rchild=NULL;
}
//入隊函數
void EnQueue(BiTree *a,BiTree node){
    a[rear++]=node;
}
//出隊函數
BiTNode* DeQueue(BiTNode** a){
    return a[front++];
}
//輸出函數
void displayNode(BiTree node){
    printf("%d ",node->data);
}
int main() {
    BiTree tree;
    //初始化二叉樹
    CreateBiTree(&tree);
    BiTNode * p;
    //采用順序隊列,初始化創建隊列數組
    BiTree a[20];
    //根結點入隊
    EnQueue(a, tree);
    //當隊頭和隊尾相等時,表示隊列為空
    while(front<rear) {
        //隊頭結點出隊
        p=DeQueue(a);
        displayNode(p);
        //將隊頭結點的左右孩子依次入隊
        if (p->lchild!=NULL) {
            EnQueue(a, p->lchild);
        }
        if (p->rchild!=NULL) {
            EnQueue(a, p->rchild);
        }
    }
    return 0;
}

運行結果:

1 2 3 4 5 6 7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM