18.11.02 由中根序列和后根序列重建二叉樹-數據結構習題


題目內容:

我們知道如何按照三種深度優先次序來周游一棵二叉樹,來得到中根序列、前根序列和后根序列。反過來,如果給定二叉樹的中根序列和后根序列,或者給定中根序列和前根序列,可以重建一二叉樹。本題輸入一棵二叉樹的中根序列和后根序列,要求在內存中重建二叉樹,最后輸出這棵二叉樹的前根序列。

用不同的整數來唯一標識二叉樹的每一個結點,下面的二叉樹

 

中根序列是9 5 32 67

后根序列9 32 67 5

前根序列5 9 67 32

 

 

 

輸入格式:

兩行。第一行是二叉樹的中根序列,第二行是后根序列。每個數字表示的結點之間用空格隔開。結點數字范圍0~65535。暫不必考慮不合理的輸入數據。

 

輸出格式:

一行。由輸入中的中根序列和后根序列重建的二叉樹的前根序列。每個數字表示的結點之間用空格隔開。

 

輸入樣例:

9 5 32 67
9 32 67 5

 

輸出樣例:

5 9 67 32

 

時間限制:500ms內存限制:32000kb
 1 #include <iostream>
 2 #include <string.h>
 3 #include <algorithm>
 4 #include <stack>
 5 #include <string>
 6 #include <math.h>
 7 #include <queue>
 8 #include <stdio.h>
 9 #include <string.h>
10 #include <vector>
11 #include <fstream>
12 #include <set>
13 
14 using namespace std;
15 int mid[65536], back[65536];
16 int count0 = 0;//計結點個數數
17 bool flag;//是否是第一次輸出
18 
19 void init() {
20     int i = 0;
21     scanf("%d", &mid[++i]);
22     while (getchar() != '\n')//當讀入一個換行符就說明一行讀完
23         scanf("%d", &mid[++i]);
24     count0 = i;
25     for (int i = 1; i <= count0; i++)
26         scanf("%d", &back[i]);
27 }
28 
29 void front(int mids, int mide, int backs, int backe) {
30     if (mids > mide )return;
31     if (flag) {
32         printf("%d", back[backe]);
33         flag = false;
34     }
35     else
36         printf(" %d", back[backe]);
37     int spot = find(mid+mids,mid+mide+1, back[backe])-mid;
38     int lft = spot - mids;
39     front(mids, spot - 1, backs, backs + lft - 1);//遞歸輸出左子樹的根節點
40     front(spot + 1, mide, backs + lft, backe-1);//遞歸輸出右子樹的根節點
41 }
42 
43 int main()
44 {
45     flag = true;
46     init();
47     front(1, count0, 1, count0);
48     return 0;
49 }
View Code

今天做題太玄學了

這題一開始想着這個OJ的數據按以往經驗非常水所以直接遞歸吧

居然TLE

然后換棧

依然TLE??

最后發現好像是輸入里有問題,但我至今還沒明白為啥,就是將本來后序數組也用getchar判斷輸入的,改成了數元素個數輸入,然后就過了

難道是題目數據里面最后沒有換行符???

今天貌似只要做題就不順,不如回家打游戲吧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM