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