• <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>
            隨筆 - 51, 文章 - 1, 評(píng)論 - 41, 引用 - 0
            數(shù)據(jù)加載中……

            兩個(gè)樹(shù)結(jié)構(gòu)的程序

                     前幾日從朋友得到幾個(gè)關(guān)于樹(shù)結(jié)構(gòu)的題目,頗為有趣。
                     第一道題目:一個(gè)二叉樹(shù),有三種遍歷,前序遍歷,中序遍歷,后序遍歷。已知兩種遍歷的順序,求出第三種順序。如前序abc,中序bac,則后序則是bca。當(dāng)然知道前序和后序不一定能確定中序的順序。如前序ab,后序則是ba,葉結(jié)點(diǎn)b可能是左葉,也可能是右葉。就有了第二道題目
                     第二道題目:如果是一個(gè)N叉樹(shù),如果知道前序遍歷,后序遍歷,則這棵樹(shù)可能有這種可能的形式。
                     
                     和樹(shù)有關(guān)的算法一般可以用遞歸算法。因?yàn)樽訕?shù)也是一棵樹(shù),和遞歸思想吻合。這兩個(gè)程序用到的算法就是遞歸,關(guān)鍵點(diǎn)就是找出子樹(shù)的起始位置。程序如下:
            /* 得到二叉樹(shù)的后序輸出 */
            int GetPostOrder(int n, const int* preorder, const int* inorder, int* postorder)
            {
                
            if (n == 1)
                {
                    postorder[
            0= preorder[0];
                }
                
            else if (n > 1)
                {
                    
            int i;
                    
            for (i=0; i<n; i++)
                    {
                        
            if (inorder[i] == preorder[0])
                            break;
                    }
                    
            if (i == n) return -1;
                    GetPostOrder(i, preorder
            +1, inorder, postorder);
                    GetPostOrder(n
            -1-i, preorder+1+i, inorder+i+1, postorder+i);
                    postorder[n
            -1= preorder[0];
                }
                return 
            0;
            }

            /* 得到二叉樹(shù)的中序輸出,由于不唯一,所以子樹(shù)左優(yōu)先 */
            int GetInOrder(int n, const int* preorder, int* inorder, const int* postorder)
            {
                
            if (n == 1)
                {
                    inorder[
            0= preorder[0];
                }
                
            else if (n > 1)
                {
                    
            int i;
                    
            for (i=0; i<n; i++)
                    {
                        
            if (preorder[1== postorder[i])
                            break;
                    }
                    
            if (i == n) return -1;
                    i
            ++;
                    GetInOrder(i, preorder
            +1, inorder, postorder);
                    inorder[i] 
            = preorder[0];        
                    GetInOrder(n
            -1-i, preorder+1+i, inorder+i+1, postorder+i);
                }
                return 
            0;
            }

            /* 得到二叉樹(shù)的前序輸出 */
            int GetPreOrder(int n, int* preorder, const int* inorder, const int* postorder)
            {
                
            if (n == 1)
                {
                    preorder[
            0= postorder[n-1];
                }
                
            else if (n > 1)
                {
                    
            int i;
                    
            for (i=0; i<n; i++)
                    {
                        
            if (inorder[i] == postorder[n-1])
                            break;
                    }
                    
            if (i == n) return -1;
                    preorder[
            0= postorder[n-1];
                    GetPreOrder(i, preorder
            +1, inorder, postorder);
                    GetPreOrder(n
            -1-i, preorder+1+i, inorder+i+1, postorder+i);
                }
                return 
            0;
            }

            /* 得到N叉樹(shù)可能的子樹(shù)結(jié)構(gòu)的數(shù)目 */
            int PsbInOrder(int tsize, int n, const int* preorder, const int* postorder)
            {
                
            int ret = 1;
                
            if (n > 1)
                {
                    
            int i, s, size;
                    
            for (i=0,s=1,size=0; i<n-1; i++)
                    {
                        
            if (preorder[s] == postorder[i])
                        {
                            ret 
            *= PsbInOrder(tsize, i-s+2, preorder+s, postorder+s-1);
                            size
            ++;
                            s 
            = i+2;
                        }
                    }
                    
                    
            for (i=0; i<size; i++)
                    {
                        ret 
            = (tsize-i) * ret / (i+1);
                    }
                }
                return ret;
            }

            int main(void)
            {
            /*
             
            * ABFEGCDHN    (前序)
             
            * FBEGAHDNC    (中序)
             
            * FGEBHNDCA    (后序)
            */
                
            int i;
                
            int preorder[] = {'A','B','F','E','G','C','D','H','N'};
                int inorder[] = {'F','B','E','G','A','H','D','N','C'};
                int postorder[] = {'F','G','E','B','H','N','D','C','A'};
                int n = sizeof(preorder)/sizeof(int);

            /*
             
            * abejkcfghid    (前序)
             
            * jkebfghicda    (后序)
             
            */    
                
            int p1[] = {'a','b','e','j','k','c','f','g','h','i','d'};
                int p2[] = {'j','k','e','b','f','g','h','i','c','d','a'};
                int m = sizeof(p1)/sizeof(int);
                
                GetPostOrder(n, preorder, inorder, postorder);
                
            for (i=0; i<sizeof(preorder)/sizeof(int); i++)
                    printf(
            "%c", (char)postorder[i]);
                    
                i 
            = PsbInOrder(13, m, p1, p2);
                printf(
            "\n%d\n", i);
                return 
            0;
            }

            posted on 2008-03-31 11:59 lemene 閱讀(293) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


            segui久久国产精品| 国产成人精品久久一区二区三区av| 久久久久99精品成人片| 久久久久成人精品无码| 日韩精品久久久久久久电影蜜臀 | www.久久热.com| 国产精品嫩草影院久久| 漂亮人妻被中出中文字幕久久| 亚洲AV无码久久| 久久精品国产精品亚洲| 色88久久久久高潮综合影院| 国产成人精品久久综合| 亚洲国产精品久久电影欧美| 国产国产成人久久精品| 无遮挡粉嫩小泬久久久久久久| 久久99精品久久久久久不卡 | 狠狠色丁香婷婷久久综合不卡| 久久久久国产亚洲AV麻豆| 亚洲AV无码久久精品狠狠爱浪潮 | 久久久久久精品免费看SSS| 午夜不卡888久久| 国产亚洲综合久久系列| 国产精品成人久久久| 久久久久99精品成人片三人毛片| 久久久久人妻精品一区二区三区| 久久成人小视频| 精品国产乱码久久久久软件| 香港aa三级久久三级| 2020久久精品国产免费| 久久天天躁狠狠躁夜夜网站 | 国产午夜精品久久久久九九电影 | 无码人妻精品一区二区三区久久久| 精品久久人人做人人爽综合 | 婷婷综合久久狠狠色99h| 久久免费的精品国产V∧| 亚洲精品无码成人片久久| 久久无码AV一区二区三区| 久久精品中文字幕一区| 97久久国产综合精品女不卡| 热99RE久久精品这里都是精品免费| 奇米影视7777久久精品人人爽|