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

圖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