c++层次遍历_动画:二叉树遍历的多种姿势
前言
在《什么是二叉樹》中,我們介紹了二叉樹的創建(插入),查找和刪除,本文將介紹二叉樹的遍歷。而二叉樹遍歷有多種形式,他們也可以應用在不同的場景中,常見的深度優先遍歷方式有前序遍歷,中序遍歷,后序遍歷,而不常用廣度優先遍歷方式有層次遍歷。本文將會對以上遍歷方式都進行介紹。
二叉樹的遍歷
常見遍歷順序有以下幾種:
- 前序遍歷,先檢查節點值,然后遞歸遍歷左子樹和右子樹
- 中序遍歷,先遍歷左子樹,然后檢查當前節點值,最后遍歷右子樹
- 后序遍歷,先遞歸遍歷左右子樹,然后檢查當前節點值
- 層次遍歷,如名字所言,從第一層開始,一層一層往下遍歷
以下圖為例,我們一一介紹四種遍歷方式。
前序遍歷
- 輸出當前節點值10,然后輸出左子樹,最后輸出右子樹;
- 對于其左子樹來說,同樣以這樣的順序,則先輸出5,然后輸出左子樹4,最后輸出右子樹8;
- 對于其右子樹,同樣以這樣的順序,則先輸出19,然后輸出左子樹13,最后輸出右子樹24;
- 最終得到前序遍歷輸出為:10,5,4,8,19,13,24。
前序遍歷代碼:
void中序遍歷:
- 先輸出左子樹,然后輸出當前節點10,最后輸出右子樹;
- 對于其左子樹來說,同樣以這樣的順序,則先輸出左子樹4,然后輸出節點值5,最后輸出右子樹8;
- 對于其右子樹,同樣以這樣的順序,則先,輸出左子樹13,然后輸出節點值19,最后輸出右子樹24;
- 最終得到中序遍歷輸出為:4,5,8,10,13,19,24。
我們發現二叉查找樹的中序遍歷輸出就是排序后的結果。還記得嗎,二叉查找樹也叫二叉搜索樹或者二叉排序樹。
中序遍歷代碼:
void后序遍歷
- 先輸出左子樹,然后輸出右子樹,最后輸出節點值10
- 對于其左子樹來說,同樣以這樣的順序,則先輸出左子樹4,然后輸出右子樹8,最后輸出節點值5;
- 對于其右子樹,同樣以這樣的順序,則先,輸出左子樹13,然后輸出右子樹24,最后輸出節點值19
- 最終得到后序遍歷輸出為:4,8,5,13,24,19,10
后序遍歷代碼:
void層次遍歷
- 遍歷第一層,輸出10
- 遍歷第二層,輸出5,19
- 遍歷第三層,輸出4,8,13,24
雖然看起來過程很簡單,但是代碼實現卻不能像前面三種深度優先遍歷方式那樣直接使用遞歸,它更好的方式是借助一個具有先入先出特點的隊列(隊列可參考隊列-C語言實現)。以三個節點為例,我們先將根節點入隊,然后分別入隊左右孩子節點,最后輸出隊列內容,那么它的順序就是層次遍歷的順序了。
頭結點入隊:
10
輸出,隊頭元素10,并將它的左右孩子5,19入隊:
519
輸出隊頭元素5,并將它的左右孩子4,8入隊:
1948
輸出隊頭元素19,并將它的左右孩子13,24入隊:
481324
由于隊列中的元素都沒有孩子節點,因此都直接出隊,輸出4,8,13,24
最終得到的輸出順序為:10,5,19,4,8,13,24.
關鍵代碼如下:
void完整可運行代碼
完整代碼較長,請訪問:traversal.c
運行結果:
思考
前面三種遍歷方式都是直接printf輸出,如果需要遍歷返回一個數組呢?該如何實現?難點在哪?
總結
以上是生活随笔為你收集整理的c++层次遍历_动画:二叉树遍历的多种姿势的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vs 没有足够的内存继续执行程序_科赋内
- 下一篇: s3c2440移植MQTT