樹:二叉樹的層序遍歷演算法(超簡潔實現及詳細分析)
阿新 • • 發佈:2019-02-09
實現思路
我們來看看下圖的二叉連結串列 如何實現層序遍歷。
層序遍歷順序:ABECDG
A為B、E的雙親結點,遍歷順序是 根->左->右 是不是。
而且每個結點都是這樣的遍歷順序 有木有。那麼我們完全可以採用佇列的資料結構唄。A入隊->然後出隊,出隊時將其左右孩子入隊,迴圈佇列進行出隊,每次出隊將其左右孩子入隊。當佇列為空時,整棵樹層序遍歷完畢。還沒明白請看下面過程。
A->出隊
佇列:E、B
B->出隊
佇列:D、C、E
E->出隊
佇列:G、D、C
C->出隊
佇列:G、D
D->出隊
佇列:G
G->出隊
佇列為空,層序遍歷完畢 。
二叉樹層序遍歷演算法程式碼
層序遍歷函式
層序遍歷核心程式碼,利用了一個自己底層封裝的順序佇列。。
//一排一排的遍歷 利用佇列的特性喲,將根結點入佇列 然後然後出入佇列,出佇列後將其左右孩子結點入佇列 //直到佇列為空 void SeqTraverse(BiTree tree) { SeqQueue queue = Init_SeqQueue(); Push_SeqQueue(queue, tree); while (!IsEmpty_SeqQueue(queue)) { BiTree root = Pop_SeqQueue(queue); printf("%c ", root->data); if (root->lchild) Push_SeqQueue(queue, root->lchild); if(root->rchild) Push_SeqQueue(queue, root->rchild); } printf("\n"); }
完整程式碼
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include "SeqQueue.h" typedef char ElemType; typedef struct BiNode { ElemType data; struct BiNode* lchild; struct BiNode* rchild; }BiNode, *BiTree; //建立二叉連結串列 void CreateBiTree(BiTree* tree) { char c; scanf("%c", &c); if (c == ' ') { *tree = NULL; return; } *tree = malloc(sizeof(BiNode)); (*tree)->data = c; CreateBiTree(&(*tree)->lchild); CreateBiTree(&(*tree)->rchild); return; } //二叉連結串列 遞迴前序遍歷 void PreTraverse(BiTree tree) { if (tree == NULL) { return; } printf("%c ", tree->data); PreTraverse(tree->lchild); PreTraverse(tree->rchild); } //一排一排的遍歷 利用佇列的特性喲,將根結點入佇列 然後然後出入佇列,出佇列後將其左右孩子結點入佇列 //直到佇列為空 void SeqTraverse(BiTree tree) { SeqQueue queue = Init_SeqQueue(); Push_SeqQueue(queue, tree); while (!IsEmpty_SeqQueue(queue)) { BiTree root = Pop_SeqQueue(queue); printf("%c ", root->data); if (root->lchild) Push_SeqQueue(queue, root->lchild); if(root->rchild) Push_SeqQueue(queue, root->rchild); } printf("\n"); } int main(int argc, char *argv[]) { BiTree tree = NULL; printf("請前序遍歷輸入結點:"); CreateBiTree(&tree); printf("前序遍歷:"); PreTraverse(tree); printf("\n層序遍歷:"); SeqTraverse(tree); return 0; }
程式碼執行檢測
我們構建如下圖的二叉樹,注意建立二叉樹輸入序列為:ABC__D__E_G__,_代表一個空格喲。