1. 程式人生 > >HNUST-1047 二叉樹的表示

HNUST-1047 二叉樹的表示

pro ... pac using 數據結構 base str 一行 發現

1047: 二叉樹的表示

時間限制: 1 Sec 內存限制: 128 MB
提交: 4 解決: 4
[提交][狀態][討論版]

題目描述

?DJ非常癡迷於數據結構,二叉樹是他最喜歡的結構模型。這種每個頂點的度不大於2的簡單的圖總是能激發他的靈感。然而,二叉樹的表示方法是一個困擾他已久的問題。如果用鏈表表示,不直觀;畫成圖形,計算機又難以存儲。好在他現在發現了一種既直觀,計算機又便於存儲的表示方法。該方法定義如下:
1、如果二叉樹中節點X是葉子節點,則該節點直接表示為X。
2、如果二叉樹中節點X有左子樹,則該節點表示為(...)X,括號內為X的左子樹。
3、如果二叉樹中節點X有右子樹,則該節點表示為X(...),括號內為X的右子樹。

4、如果二叉樹中節點X有左右子樹,則該節點表示為(...)X(...),左邊括號內為左子樹,右邊括號內為右子樹。
現在DJ有許多二叉樹的先序序列和中序序列,DJ要你寫個程序幫他把這些二叉樹轉換為上述表示方法。

輸入

?輸入第一行為一個整數N,表示有N個待轉換的二叉樹。
接下來有N行,每行由兩個字符串組成,中間用空格分開。
每行的第一個字符串為二叉樹的先序序列,第二個字符串為二叉樹的中序序列。
輸入字符串由大寫字母組成,每個字母代表二叉樹的一個節點,不會有兩個相同的字母。
你可以假設不會輸入無效數據。

輸出

每組數據輸出占一行,輸出轉換後的二叉樹。

樣例輸入

2
AB AB
ABCD BCAD

樣例輸出

A(B)
(B(C))A(D)
根據先序遍歷和中序遍歷建立二叉樹,具體內容看我另一篇博文:http://www.cnblogs.com/Pretty9/p/7426958.html
#pragma GCC diagnostic error "-std=c++11"
#include <bits/stdc++.h>
#define _ ios_base::sync_with_stdio(0);cin.tie(0);

using namespace std;
const int N = 100 + 5;

char pre[N], in
[N]; void DFS(int ps, int pt, int is, int it){ int pos = is; while(in[pos] != pre[ps]) pos++; if(pos != is){ printf("("); DFS(ps + 1, ps + pos - is, is, pos - 1); printf(")"); } printf("%c", pre[ps]); if(pos != it){ printf("("); DFS(ps + 1 + pos - is, pt, pos + 1, it); printf(")"); } } int main(){ int T; scanf("%d", &T); while(T --){ scanf("%s %s", pre, in); DFS(0, strlen(pre) - 1, 0, strlen(in) - 1); printf("\n"); } return 0; }

HNUST-1047 二叉樹的表示