1283: Binary Tree Traversals
阿新 • • 發佈:2019-02-09
題目:
Description
給定一棵二叉樹先序遍歷得到的先序序列和後續遍歷得到的後序序列,能夠唯一確定這棵二叉樹嗎?
Input
輸入資料的第一行包含一個整數T (1 <= T <= 100),表示接下來一共有T組測試資料。
對於每組測試資料,第一行包含一個正整數N (1 <= N <= 26),表示這棵二叉樹一共有N個節點。接下來兩行每行均包含N個互不相同的大寫字母,字元之間沒有空格,分別表示對這棵二叉樹進行先序遍歷和後序遍歷後得到的先序序列和後序序列。資料保證根據先序序列和後續序列至少能夠構造出一棵二叉樹。
Output
對於每組測試資料,如果根據先序序列和後續序列能夠唯一確定一棵二叉樹,用一行輸出N個大寫字母,字元之間不應有空格,表示這棵二叉樹的中序序列。如果不能唯一確定一棵二叉樹,則用一行輸出“-1”(不包括引號)。
Sample Input
2 2 AB BA 3 ABC BCA
Sample Output
-1 BAC
程式碼:
#include<iostream>
using namespace std;
char s1[27], s2[27], s3[27];
bool f(int k1, int k2, int k3, int len)
{
if (len == 1)
{
s3[k3] = s1[k1];
return true;
}
char c = s1[k1 + 1];
for (int i = k2; i < k2 + len; i++)
{
if (s2[i] != c)continue ;
if (i == k2 + len - 2)return false;
if (!f(k1 + 1, k2, k3, i - k2 + 1))return false;
if (!f(k1 - k2 + i + 2, i + 1, k3 - k2 + i + 2, k2 + len - 2 - i))return false;
s3[k3 - k2 + i + 1] = s1[k1];
}
return true;
}
int main()
{
int t, n;
cin >> t;
while (t--)
{
cin >> n >> s1 >> s2;
s3[n] = '\0' ;
if (f(0, 0, 0, n))cout << s3 << endl;
else cout << "-1\n";
}
return 0;
}
/**********************************************************************
Problem: 1283
User: 3901140225
Language: C++
Result: AC
Time:4 ms
Memory:2024 kb
**********************************************************************/