亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

二叉樹的四種遍歷算法

2019-11-06 06:32:05
字體:
來源:轉載
供稿:網友

二叉樹在作為一種重要的數據結構,它的很多算法的思想在很多地方都用到了,比如說大名鼎鼎的 STL 算法模板,里面的優先隊列(PRiority_queue)、集合(set、map)等等都用到了二叉樹里面的思想,如果有興趣的小伙伴可以去查找一些這些方面的資料。但是我們現在先不討論那么高深的數據結構,我們先從二叉樹的遍歷開始:

先來看一下二叉樹長什么樣子:

這里寫圖片描述

這是百度來的一張二叉樹圖,我們可以看到, 這棵二叉樹一共有 7 個節點, 其中, 0 號節點叫做“根節點”, 下面的 1 號節點和 2 號節點是 0 號節點的子節點,1 號節點為 0 號節點的“左子節點, 2 號節點為 0 號節點的 右子節點 同時 1 號節點和 2 號節點又是 3 號節點、 4 號節點和 5 號節點、6號節點的雙親節點, 0 號節點有分別以 1 號節點和 2 號節點作為根節點的左右子樹。 5 號節點和 6 號節點沒有子節點(子樹),那么它們被稱為“葉子節點”。 好了,一些常用的基本概念就到這了,能理解就行,如果還想了解更多專業術語,可以去找一些別的資料。

下面進入正題,二叉樹的遍歷:

一般來說,二叉樹常用的遍歷方式有:前序遍歷、中序遍歷、后序遍歷、層序遍歷 四種遍歷方式,不同的遍歷算法,其思想略有不同,我們來看一下這四種遍歷方法主要的算法思想:

1、先序遍歷二叉樹順序:根節點 –> 左子樹 –> 右子樹,即先訪問根節點,然后是左子樹,最后是右子樹。 上圖中二叉樹的前序遍歷結果為:0 -> 1 -> 3 -> 4 -> 2 -> 5 -> 6

2、中序遍歷二叉樹順序:左子樹 –> 根節點 –> 右子樹,即先訪問左子樹,然后是根節點,最后是右子樹。 上圖中二叉樹的中序遍歷結果為:3 -> 1 -> 4 -> 0 -> 5 -> 2 -> 6

3、后續遍歷二叉樹循序:左子樹 –> 右子樹 –> 根節點,即先訪問左子樹,然后是右子樹,最后是根節點。 上圖中二叉樹的后序遍歷結果為:3 -> 4 -> 1 -> 5 -> 6 -> 2 -> 0

4、層序遍歷二叉樹順序:從最頂層的節點開始,從左往右依次遍歷,之后轉到第二層,繼續從左往右遍歷,持續循環,直到所有節點都遍歷完成 上圖中二叉樹的中序遍歷結果為:0 -> 1 -> 2 -> 3 -> 4 -> 5 -> 6

下面給出這四種算法思想的偽代碼:

前序遍歷:

preOrderParse(int n) { if(tree[n] == NULL) return ; // 如果這個節點不存在,那么結束 cout << tree[n].w ; // 輸出當前節點內容 preOrderParse(tree[n].leftChild); // 遞歸輸出左子樹 preOrderParse(tree[n].rightChild); // 遞歸輸出右子樹 }

中序遍歷:

inOrderParse(int n) { if(tree[n] == NULL) return ; // 如果這個節點不存在,那么結束 inOrderParse(tree[n].leftChild); // 遞歸輸出左子樹 cout << tree[n].w ; // 輸出當前節點內容 inOrderParse(tree[n].rightChild); // 遞歸輸出右子樹 }

后續遍歷:

pastOrderParse(int n) { if(tree[n] == NULL) return ; // 如果這個節點不存在,那么結束 pastOrderParse(tree[n].leftChild); // 遞歸輸出左子樹 pastOrderParse(tree[n].rightChild); // 遞歸輸出右子樹 cout << tree[n].w ; // 輸出當前節點內容 }

可以看到前三種遍歷都是直接通過遞歸來完成,用遞歸遍歷二叉樹簡答方便而且好理解,接下來層序遍歷就需要動點腦筋了,我們如何將二叉樹一層一層的遍歷輸出?其實在這里我們要借助一種數據結構來完成:隊列。 我們都知道,隊列是一種先進先出的數據結構,我們可以先將整顆二叉樹的根節點加入隊尾,然后循環出隊,每次讀取對頭元素輸出并且將隊頭元素出隊,然后將這個輸出的元素節點的的左右子樹分別依次加入隊尾,重復這個循環,知道隊列為空的時候結束輸出。那么整個二叉樹就被我們采用層序遍歷的思想輸出來了。下面我們看一下上圖的二叉樹用層序遍歷思想的遍歷步驟:

這里寫圖片描述

因為筆者不會用 PS,所以用手工代替了,字寫的不好,大家多擔待,理解過程就行了。好了,對于上圖中的步驟,我們用偽代碼來實現:

while(!que.empty()) { int n = que.front(); // 得到隊頭元素 que.pop(); // 隊頭元素出隊列 // 如果當前節點的右子樹不為空,那么輸出節點的數值,并且在隊尾插入左右子節點 if(tree[n].w != NULL) { cout << tree[n].w; que.push(tree[n].leftChild); que.push(tree[n].rightChild); }}

Ok,下面來看一下這幾個遍歷算法的最終代碼:

/* * 二叉樹的四種遍歷方式,這里沒有采用真實的指針去做, * 而是采用數組下標去模擬指針,是一種更加方便快速的方法 */#include <iostream>#include <queue> using namespace std;const int N = 10010;const int INF = -1; // 我們用一個常數來表示當前二叉樹節點為空的情況 struct Node { int w; // 當前樹節點的值 int p; // 當前樹節點的雙親所在數組下標 int l; // 當前樹節點的左子節點所在數組下標 int r; // 當前樹節點的右子節點所在數組下標 }; Node node[N];// 按照前序遍歷二叉樹的順序輸入樹節點 void input(int n) { cin >> node[n].w; if(node[n].w == INF) { // 輸入 -1 代表當前節點所在子二叉樹停止輸入 return ; } node[n].p = n / 2; node[n].l = n * 2; node[n].r = n * 2 + 1; input(n*2); input(n*2+1);}// 前序遍歷二叉樹 void preOrderParse(int n) { if(node[n].w == INF) { return ; } cout << node[n].w << " "; preOrderParse(node[n].l); preOrderParse(node[n].r);} // 中序遍歷二叉樹 void inOrderParse(int n) { if(node[n].w == INF) { return ; } inOrderParse(n*2); cout << node[n].w << " "; inOrderParse(n*2+1); }// 后續遍歷二叉樹 void postOrderParse(int n) { if(node[n].w == INF) { return ; } postOrderParse(n*2); postOrderParse(n*2+1); cout << node[n].w << " ";} /* * 層序遍歷二叉樹,這里采用的是 C++ STL 模板的提供的隊列(queue), * 并沒有自己去實現一個隊列 */ void sequenceParse() { queue<int> que; int n = 1; que.push(1); // 插入根節點所在數組下標 while(!que.empty()) { n = que.front(); que.pop(); // 得到隊頭元素并且將隊頭元素出隊列 // 如果當前節點不為空,那么輸出該節點,并且將該節點的左右子節點插入隊尾 if(node[n].w != INF) { cout << node[n].w << " "; que.push(node[n].l); que.push(node[n].r); } }}int main() { cout << "請以前序遍歷的順序輸入二叉樹,空節點輸入 -1 :" << endl; input(1); // 從下標為 1 開始前序輸入二叉樹 cout << "前序遍歷:" << endl; preOrderParse(1); cout << endl << "中序遍歷:" << endl; inOrderParse(1); cout << endl << "后序遍歷:" << endl; postOrderParse(1); cout << endl << "層序遍歷:" << endl; sequenceParse(); return 0;}

結果:

這里寫圖片描述

我們和上面的結果對比一下,完全符合,OK,關于二叉樹的四種遍歷算法就完成了,希望能幫到你。

如果博客中有什么不正確的地方,還請多多指點,如果覺得我寫的不錯,請點個贊支持我吧。 謝謝觀看。。。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产女人精品视频| 亚洲人成在线免费观看| 亚洲人成电影网站色…| 国产日韩欧美在线| 久久久久久久影视| 精品色蜜蜜精品视频在线观看| 日韩欧美黄色动漫| 亚洲电影av在线| 国产精品露脸av在线| 久99久在线视频| 78色国产精品| 国模精品系列视频| 欧美激情在线狂野欧美精品| 欧美日韩亚洲一区二区三区| 色爱精品视频一区| 97香蕉超级碰碰久久免费的优势| 欧美亚洲视频在线看网址| 国产精品女人网站| 综合欧美国产视频二区| 91wwwcom在线观看| 亚洲国产精品嫩草影院久久| 疯狂做受xxxx欧美肥白少妇| 亚洲三级黄色在线观看| 日韩福利伦理影院免费| 欧美精品999| 国产精品欧美风情| 欧美一级淫片播放口| 97香蕉久久超级碰碰高清版| 亚洲夜晚福利在线观看| 久久精品国产久精国产思思| 45www国产精品网站| 亚洲精品乱码久久久久久金桔影视| 日韩a**站在线观看| 在线视频精品一| 亚洲а∨天堂久久精品9966| 亚洲精品一区二区网址| 欧美色图在线视频| 少妇高潮久久77777| 综合网日日天干夜夜久久| 成人97在线观看视频| 亚洲精品videossex少妇| 欧美俄罗斯性视频| 日日骚av一区| 亚洲的天堂在线中文字幕| 亚洲欧洲日产国码av系列天堂| 国产精品69久久| 亚洲人成网站777色婷婷| 国产精品一区二区久久精品| 亚洲色图激情小说| 亚洲欧美国产视频| 国产91精品青草社区| 国产精品999999| 九九热r在线视频精品| 国产亚洲精品久久久| 在线日韩中文字幕| 国产精品偷伦免费视频观看的| 国模极品一区二区三区| 国产精品jvid在线观看蜜臀| 国产精品丝袜久久久久久高清| 久久久国产精彩视频美女艺术照福利| 国产成人精品免高潮费视频| 日韩精品日韩在线观看| 国语自产精品视频在线看| 亚洲japanese制服美女| 国产精品入口夜色视频大尺度| 欧美精品久久久久久久免费观看| 久久97久久97精品免视看| 日本精品免费观看| 欧美有码在线观看视频| 亚洲黄色片网站| yellow中文字幕久久| 日本一区二区在线播放| 欧美中文在线免费| 91高潮在线观看| 亚洲欧洲第一视频| 亚洲美女性视频| 国产精品成人国产乱一区| 久久免费精品日本久久中文字幕| 成人精品在线观看| 欧美精品久久久久a| 国产欧美精品在线播放| 中文字幕日韩av电影| 91精品视频专区| 九九热这里只有在线精品视| 精品国产网站地址| 亚洲国产一区二区三区四区| 国产女人精品视频| 亚洲人成在线播放| 亚洲精品av在线播放| 亚洲美女又黄又爽在线观看| 国产成人综合av| 精品国产乱码久久久久酒店| 亚洲人精选亚洲人成在线| 在线精品91av| 欧美激情小视频| 精品高清美女精品国产区| 精品丝袜一区二区三区| 日韩精品丝袜在线| 不卡av电影院| 欧美大片va欧美在线播放| 日韩美女视频在线观看| 亚洲春色另类小说| 亚洲国产97在线精品一区| 亚洲高清福利视频| 欧美久久精品午夜青青大伊人| 激情懂色av一区av二区av| 亚洲欧美色图片| 狠狠爱在线视频一区| 51精品国产黑色丝袜高跟鞋| 黑人巨大精品欧美一区二区三区| 欧美精品免费播放| 91在线观看免费高清完整版在线观看| 国产精品黄色影片导航在线观看| 久久久精品国产一区二区| 欧美猛交ⅹxxx乱大交视频| 一区二区三区www| 丰满岳妇乱一区二区三区| 91色在线观看| 成人啪啪免费看| 国产精品一区二区三区久久久| 国产精品视频一区国模私拍| 国产精品无av码在线观看| 欧美一区二区大胆人体摄影专业网站| 久久精品国产99国产精品澳门| 97在线视频免费| 欧美视频专区一二在线观看| 久久躁狠狠躁夜夜爽| 欧美伊久线香蕉线新在线| 91网站在线看| 热99久久精品| 亚洲成人免费在线视频| 欧美日韩aaaa| 欧美床上激情在线观看| 91亚洲国产成人久久精品网站| 精品国产鲁一鲁一区二区张丽| 亚洲欧美精品一区二区| 国产精品中文字幕在线| 国产精品久久久久久久久免费看| 色悠久久久久综合先锋影音下载| 欧美日韩成人在线观看| 亚洲国产精品成人精品| 国产乱人伦真实精品视频| 亚洲国产精品999| 国产精品在线看| 成人精品一区二区三区电影黑人| 精品久久久久久久久中文字幕| 国产日韩欧美视频在线| 国产成人小视频在线观看| 午夜精品久久久99热福利| 两个人的视频www国产精品| 97热在线精品视频在线观看| 日韩美女av在线免费观看| 色综合久久精品亚洲国产| 久久久久久久久久国产| 亚洲精品久久在线| 亚洲人成电影在线| 成人亚洲激情网| 91中文精品字幕在线视频| 97色在线播放视频| 精品久久久中文| 亚洲第一页自拍| 欧美做爰性生交视频| 亚洲欧美日韩爽爽影院| 伊人久久五月天|