C語言 · FBI樹

算法訓練 FBI樹  
時間限制:1.0s   內存限制:256.0MB
       
錦囊1
  二叉樹。
問題描述
  咱們能夠把由「0」和「1」組成的字符串分爲三類:全「0」串稱爲B串,全「1」串稱爲I串,既含「0」又含「1」的串則稱爲F串。
  FBI樹是一種二叉樹,它的結點類型也包括F結點,B結點和I結點三種。由一個長度爲2N的「01」串S能夠構造出一棵FBI樹T,遞歸的構造方法以下:
  1)T的根結點爲R,其類型與串S的類型相同;
  2)若串S的長度大於1,將串S從中間分開,分爲等長的左右子串S1和S2;由左子串S1構造R的左子樹T1,由右子串S2構造R的右子樹T2。
  如今給定一個長度爲2N的「01」串,請用上述構造方法構造出一棵FBI樹,並輸出它的後序遍歷序列。
輸入格式
  第一行是一個整數N(0 <= N <= 10),第二行是一個長度爲2N的「01」串。
輸出格式
  包括一行,這一行只包含一個字符串,即FBI樹的後序遍歷序列。
樣例輸入
3
10001011
樣例輸出
IBFBBBFIBFIIIFF
數據規模和約定
  對於40%的數據,N <= 2;
  對於所有的數據,N <= 10。
  注:
  [1] 二叉樹:二叉樹是結點的有限集合,這個集合或爲空集,或由一個根結點和兩棵不相交的二叉樹組成。這兩棵不相交的二叉樹分別稱爲這個根結點的左子樹和右子樹。
  [2] 後序遍歷:後序遍歷是深度優先遍歷二叉樹的一種方法,它的遞歸定義是:前後序遍歷左子樹,再後序遍歷右子樹,最後訪問根。
 
註釋:本題就是用到了二叉樹。解題時思路清晰、目的明確就行了,主要分如下幾個步驟:
一、以字符串的形式錄入原始串s;
二、按題意求欲設的01串的長度:pow(2,n);
三、將字符串s轉換爲01串:全0爲B,全1爲I,混合串爲F;
四、遞歸建立二叉樹;
五、後序遍歷二叉樹並輸出。
 1 #include<stdio.h>
 2 #include<math.h>
 3 #define MAX 10000
 4 int num[MAX];
 5 char s[MAX];
 6 //定義結構體 
 7 struct Node{
 8     Node *left,*right;
 9     char c;
10 };
11 //將字符數組轉爲整形數組 
12 void strtoint(char *s, int *num, int len) {
13     for(int i=0;i<len;i++){
14         num[i] = s[i] - '0';
15     }
16 }
17 //後序遍歷:遞歸遍歷左右子樹 
18 void lastdfs(Node *head){
19     if(head->left)
20         lastdfs(head->left);
21     if(head->right)
22         lastdfs(head->right);
23     printf("%c",head->c);
24 }
25 //判斷並返回01串是否爲全0、全一、混合串 
26 char fbi(int *num,int begin,int end){
27     int sum=0;
28     for(int i=begin;i<=end;i++) {
29         sum+=num[i];
30     }
31     if(sum==0) return 'B';//全0串 
32     else if(sum==end-begin+1) return 'I';//全1串 
33     else return 'F';//混合串 
34 }
35 //建立二叉樹
36 Node *buildTree(int *num, int begin, int end){
37     char c = fbi(num,begin,end);
38     Node *p = new Node;
39     p->c = c;
40     if(begin<end){//說明子串不爲空 
41         int mid = (begin+end)/2;
42         p->left = buildTree(num,begin,mid);
43         p->right = buildTree(num,mid+1,end);
44     }else{//若子串爲空,左右子樹賦NULL 
45         p->left=NULL;
46         p->right=NULL;
47     }
48     return p;
49 }
50 int main(){
51     int n;
52     scanf("%d",&n);
53     getchar();//處理回車
54     gets(s);
55     int len = pow(2,n);//按題意"01"串的長度爲2的n次方 
56     strtoint(s,num,len);
57     Node *head = buildTree(num,0,len-1);
58     lastdfs(head);
59     return 0;
60 }
相關文章
相關標籤/搜索