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

圖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