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

隨筆-80  評論-24  文章-0  trackbacks-0
假設已經有了前序遍歷和中序遍歷的結果,希望通過一個算法重建這棵樹。已知遍歷結果為字符串,且樹的每個節點的value都是一個字符,且各不相同。
如,前序:a b d c e f
中序:d b a e c f
則由前序可知,樹的根必定是前序遍歷的第一個節點a,再找a在中序中的位置,則可知道中序遍歷中a之前的所有節點都是a的左子樹,這樣,就可以遞歸建立左子樹,同樣中序遍歷中a右邊的序列是a的右子樹,遞歸建立即可。
代碼如下:

 1 struct NODE {
 2   NODE* left;
 3   NODE* right;
 4   char value;
 5 };
 6 
 7 void rebuild_bitree(char *pre_order, 
 8     char *in_order, 
 9     int treelen, 
10     NODE **root) {
11   assert(root != NULL);
12   if (pre_order == NULL ||  
13       in_order == NULL ||  
14       treelen <= 0) {
15     return;
16   }
17   if (*root == NULL) {
18     *root = new NODE;
19   }
20   (*root)->value = pre_order[0];
21   (*root)->left = (*root)->right = NULL;
22   int i = 0;
23   for (i = 0; i < treelen; ++i) {
24     if (in_order[i] == pre_order[0]) {
25       break;
26     }   
27   }
28   rebuild_bitree(pre_order + 1,  
29       in_order, 
30       i,  
31       &((*root)->left));
32   rebuild_bitree(pre_order + i + 1,  
33       in_order + i + 1,  
34       treelen - i - 1,  
35       &((*root)->right));
36 }

如果已經知道了中序遍歷結果和后序遍歷結果,那么如何重構二叉樹呢?其實仔細想想,它和知道前序和中序來構造二叉樹的原理是一樣,只不過后序的根節點在序列的最后,只要知道根節點那么就可以去掃描中序序列,然后確定左子樹和右子樹,代碼如下:

 1 void rebuild_bitree(char *in_order, 
 2     char *post_order, 
 3     int treelen, 
 4     NODE **root) {
 5   if (in_order == NULL || 
 6       post_order == NULL || 
 7       treelen <= 0) {
 8     return;
 9   }
10 
11   if (*root == NULL) {
12     *root = new NODE;
13   }
14   (*root)->value = post_order[treelen - 1];
15   (*root)->left = (*root)->right = NULL;
16 
17   int i = 0;
18   for (i = 0; i < treelen; ++i) {
19     if (in_order[i] == post_order[treelen - 1]) {
20       break;
21     }
22   }
23 
24   rebuild_bitree(in_order, 
25       post_order, 
26       i, 
27       &(*root)->left);
28   rebuild_bitree(in_order + i + 1, 
29       post_order + i, 
30       treelen - i - 1, 
31       &(*root)->right);
32 }

上面寫出的都是遞歸算法,因為遞歸本質上就是利用棧來操作,所以,如果要采用非遞歸算法來實現的話該如何做呢?現在還是以知道后序和中序,來重建二叉樹,還是前面的例子:
中序:d b a e c f 
后序:d b e f c a
1、還是先用一個棧保存后序中的節點在中序中的索引值,初始棧為空
2、對后序從后向前掃描,1)若棧為空,則該節點直接入棧;2)若當前節點在中序中的索引值大于棧頂節點在中序中的索引值,則可知該節點為棧頂節點的右孩子;3)只要當前節點在中序中的索引值小于棧頂 節點在中序節點中的索引值,就連續出棧,當前節點是最后一個出棧節點的左孩子;
這樣程序如下:

 1 void rebuild_bitree(char *in_order,                                                                               
 2     char *post_order, 
 3     int treelen, 
 4     NODE **root) {
 5   if (in_order == NULL || post_order == NULL || treelen <= 0) {
 6     return;
 7   }
 8   if (*root == NULL) {
 9     *root = new NODE;
10     (*root)->value = post_order[treelen - 1];
11     (*root)->left = (*root)->right = NULL;
12   }
13   std::stack<int> index_stack;
14   std::stack<NODE *> node_stack;
15   int i;
16   int j;
17   NODE *tmp1;
18   NODE *tmp2;
19   for (i = treelen - 1; i >= 0; --i) {
20     if (i == treelen - 1) {
21       tmp1 = *root;
22     } else {
23       tmp1 = new NODE;
24       tmp1->value = post_order[i];
25       tmp1->left = tmp1->right = NULL;
26     }
27     for (j = 0; j < treelen; ++j) {
28       if (in_order[j] == post_order[i]) {
29         break;
30       }
31     }
32     if (index_stack.empty()) {
33       index_stack.push(j);
34       node_stack.push(tmp1);
35     } else if (j > index_stack.top()) {
36       node_stack.top()->right = tmp1;
37       index_stack.push(j);
38       node_stack.push(tmp1);
39     } else {
40       while (!index_stack.empty() && j < index_stack.top()) {
41         index_stack.pop();
42         tmp2 = node_stack.top();
43         node_stack.pop();
44       }
45       tmp2->left = tmp1;
46       index_stack.push(j);
47       node_stack.push(tmp1);
48     }
49   }

由前序和中序重構二叉樹的非遞歸算法和上面相似,就是對前序由前向后掃描,具體算法就不寫出來了
posted on 2012-09-03 14:24 myjfm 閱讀(571) 評論(0)  編輯 收藏 引用 所屬分類: 算法基礎
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美11—12娇小xxxx| 久久av一区二区三区漫画| 亚洲精品日韩激情在线电影| 欧美日韩一区二区三区在线视频| 久久久青草婷婷精品综合日韩| 欧美成人xxx| 国产日韩一级二级三级| 99精品视频免费观看视频| 午夜一区二区三区不卡视频| 欧美福利视频在线| 亚洲高清123| 亚洲午夜视频| 久久久青草青青国产亚洲免观| 久久理论片午夜琪琪电影网| 欧美激情国产精品| 亚洲欧美卡通另类91av | 欧美高清视频在线| 免费一区视频| 国产精品wwwwww| 亚洲第一区色| 欧美尤物一区| 亚洲一区观看| 欧美乱大交xxxxx| 狠狠做深爱婷婷久久综合一区| av成人天堂| 麻豆精品视频在线观看| 亚洲免费观看高清完整版在线观看熊 | 国产精品区一区| 亚洲第一精品影视| 欧美影院精品一区| 免费视频一区| 久久一二三四| 性欧美大战久久久久久久久| 久久久综合激的五月天| 亚洲日本va午夜在线电影| 亚洲精品一区二区三区99| 国产伦精品一区二区三区视频黑人| 亚洲欧美日韩精品久久奇米色影视| 欧美国产亚洲另类动漫| 欧美一区二区三区喷汁尤物| 在线一区二区日韩| 午夜欧美大尺度福利影院在线看| 亚洲日韩第九十九页| 亚洲欧美中文另类| 亚洲主播在线观看| 国产精品综合| 久久精品国产99国产精品澳门| 亚洲少妇在线| 国产日韩欧美在线一区| 久久av在线| 欧美有码视频| 亚洲人成网站影音先锋播放| 模特精品裸拍一区| 欧美极品一区二区三区| 亚洲香蕉成视频在线观看 | 久久精品一本| 日韩视频免费观看高清在线视频 | 亚洲一区www| 欧美在线精品免播放器视频| 国内精品视频在线播放| 欧美激情综合色| 国产精品热久久久久夜色精品三区| 欧美一区二区三区免费看| 久久激情视频久久| 亚洲婷婷免费| 久久久久网址| 欧美一级艳片视频免费观看| 久久九九热re6这里有精品| 日韩视频第一页| 亚洲欧美日韩电影| 夜夜狂射影院欧美极品| 久久久久久夜| 午夜精品在线| 国产精品欧美精品| 亚洲日本视频| 亚洲人精品午夜| 久久亚洲精选| 久久久国产精品一区二区三区| 欧美人牲a欧美精品| 亚洲毛片在线观看| 一本色道精品久久一区二区三区| 久久九九国产精品怡红院| 久久精视频免费在线久久完整在线看| 另类激情亚洲| 欧美黄色一区二区| 亚洲欧美日韩另类| 久久福利毛片| 国产日韩一级二级三级| 欧美日韩久久精品| 免费黄网站欧美| 久久精品99无色码中文字幕| 中文久久乱码一区二区| 欧美成人自拍视频| 欧美电影打屁股sp| 国产精品久久久久aaaa| 欧美视频你懂的| 国产精品xvideos88| 国产精品电影观看| 国产精品外国| 很黄很黄激情成人| 亚洲国产岛国毛片在线| 99re亚洲国产精品| 亚洲视频在线看| 欧美一级在线视频| 欧美亚洲在线| 欧美成人精品影院| 99国产精品国产精品久久| 一本色道久久| 久久久久久9999| 欧美国产综合视频| 免费在线观看成人av| 欧美理论电影在线观看| 国产精品人人做人人爽人人添| 国产精品一区2区| 一色屋精品亚洲香蕉网站| 一区二区三区在线观看视频| 国产欧美亚洲一区| 国内精品久久久久久久影视蜜臀| 国产一区二区三区丝袜| 在线精品在线| 亚洲在线一区二区| 亚洲电影免费观看高清完整版在线 | 久久爱www.| 久久精品免费观看| 久久看片网站| 欧美日韩国产91| 国产亚洲精品成人av久久ww| 亚洲国产精品第一区二区| 亚洲一卡久久| 欧美国产欧美综合| 欧美一区二区精美| 欧美在线高清视频| 亚洲精品一区二区三区99| 亚洲欧美国产制服动漫| 欧美精品一区在线发布| 一本色道久久99精品综合| 99热这里只有精品8| 国产日本欧美一区二区| 欧美一区日本一区韩国一区| 亚洲日本欧美在线| 欧美激情亚洲自拍| 亚洲女ⅴideoshd黑人| 久久久久久电影| 亚洲资源av| 国产一区二区三区免费不卡| 亚洲一二三级电影| 在线一区欧美| 国产精品日韩一区二区| 亚洲精品在线电影| 久久精品人人做人人爽电影蜜月| 欧美日韩综合在线| 国产精品自在欧美一区| 亚洲免费成人| 欧美在线视频观看免费网站| 亚洲黄一区二区三区| 亚洲一区二区三区四区五区黄 | 久久人体大胆视频| 欧美全黄视频| 欧美三区不卡| 久久久久国色av免费观看性色| 欧美一区二区三区播放老司机| 久久嫩草精品久久久久| 久久久国产精品亚洲一区 | 久久亚洲精选| 久久亚洲精品中文字幕冲田杏梨| 免费在线日韩av| 欧美性久久久| 在线视频精品一区| 欧美高清在线精品一区| 一区二区三区欧美日韩| 免费一级欧美片在线播放| 久久精品免费播放| 亚洲三级视频| 欧美成年人视频| 亚洲高清视频中文字幕| 篠田优中文在线播放第一区| 欧美激情影音先锋| 久久久久一本一区二区青青蜜月| 国产精品久久久久久久久久免费看| 欧美午夜剧场| 久久综合激情| 免费看亚洲片| 亚洲美女免费精品视频在线观看| 99精品国产在热久久婷婷| 在线免费观看日本一区| 午夜精品999| 你懂的国产精品永久在线| 激情综合五月天| 亚洲小说欧美另类婷婷| 欧美电影免费观看高清完整版| 久久久久久久久久看片| 伊人久久久大香线蕉综合直播| 一本一本a久久| 久久久亚洲欧洲日产国码αv| 欧美电影免费观看高清| 久久亚洲国产成人| 亚洲一区二区毛片| 亚洲日韩欧美视频| 一区二区在线免费观看| 国产精品亚洲一区|