程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj_2255_Tree Recovery_解題報告

poj_2255_Tree Recovery_解題報告

編輯:C++入門知識

題意:輸入兩組數據,分別是前序遍歷序列和中序遍歷序列,你需要編寫程序通過這兩組數據求出該樹的後序遍歷序列(前序序列 + 中序序列 = 後序序列) 解法:遞歸 題目分析: 可以先按照用筆和紙的形式去推導出後序序列。推導過程省略,在推導過程中我們會發現規律: 假設 前序序列是 A B E H F C G I  中序序列是 H E B F A C I G (圖如下) 每一次從前序序列裡,按順序抽取出字母就能將中序序列分割,並根據中序遍歷的特性。分割後的兩部分分別是 左子樹 和 右子樹(注意,他們也是二叉樹!) 就像這樣:取A, 中序序列被分割為 左子樹:H E B F  右子樹 C I G 繼續取B,但是這次是對左子樹:H E B F 進行分割。 分割結果是: 左子樹:H E  右子樹  B F 直到不能再分割,遞歸會返回去到第一次使用 A 分割出來的 右子樹 裡繼續分割 上述整個過程都是遞歸,所以結合代碼和用紙筆畫一次會更好理解   代碼: [cpp]   #include <stdio.h>   #include <stdlib.h>   typedef struct TreeNode   {       char    data;       struct TreeNode   *lchild;       struct TreeNode   *rchild;   } Node, *PNode;      char     preorder[28];   //存放前序序列   char     infix[28];  //存放中序序列   char    *Pr;      void build(char *in, char *pr, PNode *tr);   void postordertraversal(PNode T);      int main()   {       //先建樹、再後序遍歷輸出       PNode    T;              while(scanf("%s %s", &preorder[1], &infix[1]) == 2)       {           build(&infix[1], &preorder[1], &T);           postordertraversal(T);           printf("\n");       }       return    0;   }      void build(char *in, char *pr, PNode *tr)   {       char    *p = in;       Pr = pr;       if (*in == 0)       {           *tr = NULL;           return;       }       while (1)       {           if (*in == *Pr)           {               (*tr) = (PNode)malloc(sizeof(Node));               (*tr)->data = *Pr;               *in = 0;               break;           }           in++;       }       Pr = Pr + 1;       build(p, Pr, &(*tr)->lchild);       build(in+1, Pr, &(*tr)->rchild);   }      void postordertraversal(PNode T)   {       if (T == NULL)           return;       postordertraversal(T->lchild);       postordertraversal(T->rchild);       printf("%c", T->data);   }     這份代碼有些東西需要注意: 這裡使用到指針,其實可以不使用指針的,下面介紹的更精巧的解法就是用下標的。能盡量不用指針就盡量不用 注意指向指針的指針在這裡的作用,這裡有講解 上面的解法是比較直接容易想到的,所以代碼沒有很精巧。而這裡有份更好的解法!  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved