1. 程式人生 > >樹:二叉樹的層序遍歷演算法(超簡潔實現及詳細分析)

樹:二叉樹的層序遍歷演算法(超簡潔實現及詳細分析)

實現思路

我們來看看下圖的二叉連結串列 如何實現層序遍歷

層序遍歷順序: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__,_代表一個空格喲。

執行結果