數據結構36:二叉樹層次遍歷


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


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

圖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