C語言實(shí)現(xiàn)二叉樹層次遍歷介紹
什么是層次遍歷?
對(duì)于一顆二叉樹來說,從根節(jié)點(diǎn)開始,按從上到下、從左到右的順序訪問每一個(gè)結(jié)點(diǎn)。
注:每一個(gè)結(jié)點(diǎn)有且訪問一次。
那我們?nèi)绾蝸韺?shí)現(xiàn)這個(gè)算法呢?
實(shí)現(xiàn)原理:
對(duì)于二叉樹來說,它是一個(gè)遞歸的定義,我們要實(shí)現(xiàn)層次遍歷必然要滿足從上到下、從左到右這個(gè)要求,從根結(jié)點(diǎn)出發(fā),我們可以將所有意義上的根結(jié)點(diǎn)都存儲(chǔ)在隊(duì)列之中,那我們可以使用隊(duì)列先進(jìn)先出的特點(diǎn)來實(shí)現(xiàn)要求的遍歷。
這里我們需要引用隊(duì)列來實(shí)現(xiàn)。
主體代碼:
BiTree InitTree()//二叉樹的創(chuàng)建
{
BiTree T =(BiTree) malloc(sizeof(Tree));
char data;
scanf("%c", &data);
getchar();
if (data == '#')//如果data為#則該子樹為空值
return NULL;
else {
T->data = data;
printf("請(qǐng)輸入%c的左子樹:\n", data);
T->lchild = InitTree();
printf("請(qǐng)輸入%c的右子樹:\n", data);
T->rchild = InitTree();
}
return T;
}
void ShowCengci(BiTree T)
{
LinkQueue qu;
InitQueue(&qu);//初始化隊(duì)列
enQueue(&qu, T);//根結(jié)點(diǎn)入隊(duì)
while (QueueEmpty(qu))//判斷隊(duì)列中是否為空
{
BiTree S = deQueue(&qu);//根節(jié)點(diǎn)出隊(duì)
printf("%c ", S->data);
if (S->lchild != NULL)//判斷左右子樹是否為空,不為空則入隊(duì)
{
enQueue(&qu, S->lchild);
}
if (S->rchild != NULL)
{
enQueue(&qu, S->rchild);
}
}隊(duì)列的鏈?zhǔn)綄?shí)現(xiàn):
typedef struct BTree
{
char data;
struct BTree* lchild;
struct BTree* rchild;
}Tree,*BiTree;
typedef struct Queue
{
BiTree data;
struct Queue* next;
}Qnode,*Queueptr;
typedef struct point
{
Queueptr front;//頭指針
Queueptr rear;//尾指針
}LinkQueue;
void InitQueue(LinkQueue* qu)
{
qu->front = qu->rear = (Queueptr)malloc(sizeof(Qnode));
if (qu->front == NULL)
return;
}
void enQueue(LinkQueue* qu, BiTree S)
{
Queueptr p = (Queueptr)malloc(sizeof(Qnode));
if (p == NULL) {
return;
}
if (S == NULL)
return;
p->data = S;
p->next = NULL;
qu->rear->next = p;
qu->rear = p;
}
int QueueEmpty(LinkQueue qu)
{
if (qu.front != qu.rear)
return 1;
else
return 0;
}
BiTree deQueue(LinkQueue* qu)
{
if (qu->front == qu->rear)
return;
Queueptr p = qu->front->next;
BiTree q = p->data;
qu->front->next = p->next;
if (qu->rear == p)
qu->rear = qu->front;
free(p);
return q;
}通關(guān)上述代碼可以實(shí)現(xiàn)對(duì)二叉樹的層次遍歷。
總結(jié)
到此這篇關(guān)于C語言實(shí)現(xiàn)二叉樹層次遍歷介紹的文章就介紹到這了,更多相關(guān)C語言二叉樹內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn) vector 的四則運(yùn)算
本文給大家介紹的是在C++中實(shí)現(xiàn)高效的vector四則運(yùn)算的方法的相關(guān)資料,需要的朋友可以參考下2016-07-07
C語言學(xué)習(xí)之函數(shù)知識(shí)總結(jié)
函數(shù)是一組一起執(zhí)行一個(gè)任務(wù)的語句。每個(gè)?C?程序都至少有一個(gè)函數(shù),即主函數(shù)?main()?,所有簡單的程序都可以定義其他額外的函數(shù)。本文就為大家詳細(xì)講講C語言中函數(shù)的相關(guān)知識(shí)點(diǎn),希望有所幫助2022-07-07
C語言 不使用strcat函數(shù)實(shí)現(xiàn)連接兩個(gè)字符串功能代碼
今天小編就為大家分享一篇C語言 不使用strcat函數(shù)實(shí)現(xiàn)連接兩個(gè)字符串功能代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
Qt5 串口類QSerialPort的實(shí)現(xiàn)
在Qt5以上提供了QtSerialPort模塊,方便編程人員快速的開發(fā)應(yīng)用串口的應(yīng)用程序。本文主要介紹了Qt5 串口類QSerialPort的實(shí)現(xiàn),,感興趣的可以了解一下2022-05-05
模擬鼠標(biāo)事件的實(shí)現(xiàn)思路及代碼
這篇文章主要介紹了模擬鼠標(biāo)事件的實(shí)現(xiàn)思路及代碼,有需要的朋友可以參考一下2013-12-12
C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式
這篇文章主要介紹了C++?vector與數(shù)組轉(zhuǎn)換寫入/讀出文件方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11

