C語言 · 求先序遍歷

算法訓練 求先序排列  
時間限制:1.0s   內存限制:256.0MB
       
錦囊1
  後序的最後一個字母爲根結點。
 
問題描述
  給出一棵二叉樹的中序與後序排列。求出它的先序排列。(約定樹結點用不一樣的大寫字母表示,長度<=8)。
輸入格式
  兩行,每行一個字符串,分別表示中序和後序排列
輸出格式
  一個字符串,表示所求先序排列

   樣例輸入
  BADC
  BDCA
樣例輸出
ABCD
 
做者註釋:解此題,狠狠的複習了一把先、中、後序遍歷二叉樹。針對此題的筆記以下:
 
先序、中序、後序分別用pre、in、last數組表示。
  一、後序的最後一個節點必爲根節點;
  二、在中序裏由根節點可劃分左右子樹;
  三、根節點就是要往先序中填充的節點;
  四、遞歸左右子樹。
 
遞歸體的四個參數:
  instart:中序起始位置;
  insend:中序終止位置;
  lastroot:後序根節點(即後序最後一個節點);
  preindex:欲填充的先序位置。
 
在中序中:
  左子樹根節點 = 上一個後序根節點 - 右子樹長度;
  右子樹根節點 = 上一個後序根節點 - 1.
 
左子樹根節點:
  lastroot - [(inend - i) + 1];
右子樹根節點:
  lastroot - 1;
左子樹的根節點插入先序中的位置:
  preindex + 1;
右子樹的根節點插入先序中的位置:
  [(i - instart) + 1] + preindex;(其中i爲中序中根節點的下標);
 
遞歸體:
  對於左子樹:dfs(instart, i - 1, lastroot - [(inend - i) + 1], preindex + 1);
  對於右子樹:dfs(i + 1, inend, lastroot - 1, preindex + [(i - instart) + 1]);
 
代碼:
 1 /*
 2 DEABFCHG
 3 DEAFHGCB
 4 */
 5 #include<stdio.h>
 6 #include<string.h>
 7 #include<stdlib.h>
 8 char pre[10],in[10],last[10];//數組規模比預算稍微設置大一點 
 9 void dfs(int instart,int inend,int lastroot,int preindex){
10     if(instart>inend) return;//出口 
11     for(int i=instart;i<=inend;i++){
12         if(in[i] == last[lastroot]){
13             pre[preindex] = in[i];
14             dfs(instart,i-1,lastroot-(inend-i)-1,preindex+1);//左子樹
15             dfs(i+1,inend,lastroot-1,preindex+(i-instart)+1);//右子樹
16             return; 
17         }
18     }
19 }
20 int main(){
21     scanf("%s",&in);//錄入中序,後序 
22     getchar();//處理回車 
23     scanf("%s",&last);
24     int leni = strlen(in);
25     int lenl = strlen(last);
26     dfs(0,leni-1,lenl-1,0);
27     printf("%s",pre);
28     return 0;
29 }
相關文章
相關標籤/搜索