18.11.02 由中根序列和後根序列重建二叉樹-資料結構習題
阿新 • • 發佈:2018-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> 5View Code#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 }
今天做題太玄學了
這題一開始想著這個OJ的資料按以往經驗非常水所以直接遞迴吧
居然TLE
然後換棧
依然TLE??
最後發現好像是輸入裡有問題,但我至今還沒明白為啥,就是將本來後序陣列也用getchar判斷輸入的,改成了數元素個數輸入,然後就過了
難道是題目資料裡面最後沒有換行符???
今天貌似只要做題就不順,不如回家打遊戲吧