青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評論-24  文章-0  trackbacks-0
樹的前序、中序以及后序遍歷的遞歸算法很簡單,大部分人都能信手拈來,但是非遞歸算法卻不是那么簡單,我們來各個(gè)擊破:
樹的結(jié)構(gòu)如下:

1 typedef struct Node {
2     int data;
3     struct Node *left, *right;
4 } BTree;
5 
1)前序非遞歸遍歷:
      前序遍歷的非遞歸算法相比較而言最簡單,只需要訪問棧頂元素,然后再將棧頂元素出棧,然后再將棧頂元素的右、左孩子入棧即可,不過這里注意的是必須得右孩子先入棧。
      程序如下:

 1 void PreOrderTraversal(BTree *root) {
 2     if (root == NULL) return;
 3     stack<BTree *> s;
 4     BTree *tmp;
 5     s.push(root);
 6     while (!s.empty()) {
 7         tmp = s.top();
 8         s.pop();
 9         printf("%d\n", tmp->data);
10         if (tmp->right != NULL) {
11             s.push(tmp->right);
12         }
13         if (tmp->left != NULL) {
14             s.push(tmp->left);
15         }
16     }
17 }
18 

      這種寫法也非常直觀,但是當(dāng)遇到中序非遞歸遍歷的時(shí)候這種寫法就不能解決問題了,原因是前序遍歷是先訪問根節(jié)點(diǎn),訪問完后就將根節(jié)點(diǎn)出棧了,后面棧的操作不再遇到根節(jié)點(diǎn),而中序遍歷的時(shí)候必須先訪問左子樹才能訪問根節(jié)點(diǎn),這樣在訪問左子樹之前根節(jié)點(diǎn)必須先入棧,但是當(dāng)某個(gè)元素出棧的時(shí)候你不能知道它的左孩子是否已經(jīng)被訪問過了,因此我們需要換一種思路:
      其實(shí)我們可以模擬中序遍歷的過程:
            只要當(dāng)前節(jié)點(diǎn)有左孩子,則必須先去訪問左子樹,而當(dāng)前節(jié)點(diǎn)就得入棧;
            如果當(dāng)前節(jié)點(diǎn)為空怎么辦?當(dāng)然就訪問它的父節(jié)點(diǎn)了,也就是棧頂元素;
            訪問完棧頂元素之后就需要將當(dāng)前節(jié)點(diǎn)置為棧頂元素的右孩子,然后棧頂元素出棧;
            再繼續(xù)上述過程直到棧空;
      代碼如下:

 1 void InOrderTraversal(BTree *root) {
 2     if (root == NULL) return;
 3     stack<BTree *> s;
 4     s.push(root);
 5     BTree *cur = root->left; //指向當(dāng)前要檢查的節(jié)點(diǎn)
 6     while (cur != NULL || !s.empty()) {
 7         while (cur != NULL) { //一直向左走
 8             s.push(cur);
 9             cur = cur->left;
10         }
11         cur = s.top();
12         s.pop();
13         printf("%d\n", cur->data);
14         cur = cur->right;
15     }
16 }
17 

后序遍歷與中序遍歷很相似,但是比中序遍歷復(fù)雜的地方是如何判斷該節(jié)點(diǎn)的左右子樹都已經(jīng)訪問過了,按照中序遍歷的寫法左子樹還是先被訪問,沒有問題,但是訪問完左子樹后不能直接訪問當(dāng)前節(jié)點(diǎn),要判斷當(dāng)前節(jié)點(diǎn)的右子樹是否已經(jīng)被訪問,如果沒有訪問則應(yīng)該繼續(xù)去訪問右子樹,最后再訪問當(dāng)前節(jié)點(diǎn):
      算法如下:
            用cur記錄當(dāng)前要檢查的節(jié)點(diǎn);
            用previsited記錄前一個(gè)被訪問(visited)的節(jié)點(diǎn);
            這樣只要cur有左孩子,則cur入棧,直到cur沒有左孩子;
            然后判斷棧頂元素的右孩子是否是上一個(gè)被訪問的節(jié)點(diǎn)或者沒有右孩子;(因?yàn)楹笮虮闅v的特性,在訪問序列中,當(dāng)前節(jié)點(diǎn)的前驅(qū)必然是其右孩子(如果有的話))
            如果有右孩子而又沒有被訪問過則cur置為當(dāng)前節(jié)點(diǎn)的右孩子,繼續(xù)上述過程;
            否則訪問當(dāng)前節(jié)點(diǎn),并置previsited為當(dāng)前節(jié)點(diǎn);
            重復(fù)以上過程直到棧空;
      代碼如下:

 1 void PostOrderTraversal(BTree *root) {
 2     if (root == NULL) return;
 3     stack<BTree *> s;
 4     BTree *cur = root; //指向當(dāng)前要檢查的節(jié)點(diǎn)
 5     BTree *previsited = NULL; //指向前一個(gè)被訪問的節(jié)點(diǎn)
 6     while (cur != NULL || !s.empty()) {
 7         while (cur != NULL) { //一直向左走直到為空
 8             s.push(cur);
 9             cur = cur->left;
10         }
11         cur = s.top();
12         //當(dāng)前節(jié)點(diǎn)的右孩子如果為空或者已經(jīng)被訪問,則訪問當(dāng)前節(jié)點(diǎn)
13         if (cur->right == NULL || cur->right == previsited) {
14             printf("%d\n", cur->data);
15             s.pop();
16             previsited = cur;
17             cur = NULL;
18         }
19         else { //否則訪問右孩子
20             cur = cur->right;
21         }
22     }
23 }
24 

理解樹的非遞歸遍歷非常重要,因?yàn)樗軒椭玫睦斫鈽涞牟僮鳌?
posted on 2012-04-26 18:18 myjfm 閱讀(751) 評論(0)  編輯 收藏 引用 所屬分類: 算法基礎(chǔ)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美夜福利tv在线| 国产九九精品视频| 亚洲视频在线视频| 亚洲网站在线| 亚洲男人的天堂在线观看| 亚洲欧美视频在线观看| 亚洲制服少妇| 久久人人爽人人爽| 欧美日韩美女在线观看| 国产乱码精品一区二区三区五月婷| 国产精品久久久久永久免费观看| 国产日韩精品综合网站| 亚洲高清不卡av| 亚洲视频网在线直播| 亚洲一区二区三区精品动漫| 亚洲欧美高清| 欧美成人在线免费视频| 日韩视频在线你懂得| 久久成人18免费网站| 久久综合久久综合这里只有精品| 美女久久网站| 国产精品久久网站| ●精品国产综合乱码久久久久| 亚洲人成欧美中文字幕| 午夜精品网站| 亚洲福利视频专区| 久久看片网站| 在线视频亚洲| 久久久久久久网站| 国产精品国产三级欧美二区| 国产日韩欧美综合精品| 在线观看欧美一区| 亚洲一区精品电影| 亚洲激情女人| 久久久久久久999精品视频| 欧美三级第一页| 91久久精品一区| 久久亚洲一区二区三区四区| 在线亚洲高清视频| 欧美激情免费在线| 亚洲国产成人久久综合| 欧美一区二区三区四区夜夜大片| 欧美激情一区在线| 久久精品一区二区国产| 国产精品婷婷| 亚洲一区二区三区国产| 最新成人av网站| 狂野欧美一区| 狠狠色综合色综合网络| 欧美一级大片在线免费观看| 亚洲国产精品精华液2区45| 欧美制服丝袜| 国产精品尤物| 欧美在线视频网站| 一区二区三区精品在线| 欧美成人精品h版在线观看| 一区视频在线看| 久久综合亚州| 久久亚洲二区| 激情校园亚洲| 久久综合九色九九| 另类天堂av| 亚洲精品午夜| 亚洲精品中文字| 欧美日韩国产不卡| 亚洲一区一卡| 欧美亚洲三区| 在线看日韩欧美| 最新日韩在线视频| 欧美偷拍一区二区| 欧美伊久线香蕉线新在线| 欧美一区二区视频在线观看2020 | 久久久精品国产免大香伊| 国产亚洲成av人在线观看导航| 久久精品99久久香蕉国产色戒| 欧美一区二区三区喷汁尤物| 激情久久中文字幕| 亚洲国产一区二区三区高清| 欧美美女操人视频| 午夜精品久久久久久久久久久久久 | 99国产精品久久久久久久| 欧美日韩成人一区二区| 老司机aⅴ在线精品导航| 欧美成年网站| 亚洲一二三区视频在线观看| 亚洲免费在线精品一区| 在线观看不卡| 一区二区av在线| 影音先锋亚洲一区| 日韩一二在线观看| 韩国美女久久| 99视频一区二区| 在线不卡中文字幕| 中文国产一区| 亚洲电影成人| 亚洲午夜精品一区二区| 激情丁香综合| 亚洲乱码视频| 在线成人h网| 一本久道久久综合婷婷鲸鱼| 影音先锋亚洲视频| 亚洲图片欧美一区| 91久久久在线| 亚洲欧美999| 一区二区国产精品| 久久人人爽人人| 亚洲永久网站| 欧美成人一区二区在线| 久久精品视频在线| 国产精品va在线播放我和闺蜜| 欧美电影在线观看完整版| 国产免费观看久久| 亚洲免费精品| 亚洲伦理中文字幕| 久热精品在线视频| 另类激情亚洲| 国产一区二区三区久久精品| 99成人免费视频| 日韩一区二区高清| 欧美成人精品一区二区| 美日韩精品视频| 国内外成人免费视频| 午夜精品福利在线| 欧美亚洲网站| 国产精品卡一卡二卡三| 在线中文字幕一区| 亚洲在线免费视频| 国产精品播放| 亚洲网站在线播放| 午夜精品久久久久| 国产精品视频男人的天堂| 一区二区免费看| 亚洲天堂偷拍| 国产精品久久久久久久9999| 亚洲视频视频在线| 午夜精品久久久久久久久久久久久| 欧美三区免费完整视频在线观看| 亚洲精品一区二区三区蜜桃久 | 欧美在线观看视频一区二区三区| 欧美午夜精品久久久久久浪潮| 亚洲精品综合| 亚洲午夜小视频| 国产精品美腿一区在线看| 亚洲一区视频在线| 久久久久久91香蕉国产| 国产亚洲永久域名| 久久精品水蜜桃av综合天堂| 麻豆乱码国产一区二区三区| 欧美激情视频给我| 欧美日韩国产123| 亚洲精品久久久久久下一站| 亚洲毛片播放| 欧美日韩精品免费观看视一区二区| 日韩手机在线导航| 欧美亚洲综合网| 一区精品久久| 欧美日本不卡| 性色av一区二区三区红粉影视| 久久漫画官网| 亚洲六月丁香色婷婷综合久久| 欧美视频第二页| 久久精品av麻豆的观看方式| 欧美黄色一级视频| 亚洲一区在线免费| 在线播放视频一区| 欧美视频在线免费看| 性欧美暴力猛交另类hd| 亚洲第一黄色| 欧美一区日韩一区| 亚洲精品国产欧美| 国产精品一区亚洲| 欧美激情按摩在线| 久久se精品一区二区| 日韩视频在线观看一区二区| 久久久久欧美精品| 一区二区三区色| 精品不卡一区| 国产精品yjizz| 欧美**人妖| 久久aⅴ国产欧美74aaa| 99精品欧美一区二区三区| 女女同性精品视频| 欧美在线1区| 亚洲视频综合| 亚洲三级影院| 依依成人综合视频| 国产精品国产三级国产专播品爱网 | 亚洲综合国产激情另类一区| 悠悠资源网久久精品| 欧美午夜电影在线| 欧美韩日亚洲| 久久久一二三| 欧美一区二区三区免费在线看| 99精品久久| 亚洲国产日韩一区| 欧美国产综合视频| 免费视频一区| 免费成人激情视频| 老司机凹凸av亚洲导航| 性xx色xx综合久久久xx|