1. 程式人生 > >7-23 還原二叉樹

7-23 還原二叉樹

7-23 還原二叉樹 (25 分)

給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。

輸入格式:

輸入首先給出正整數N(≤50),為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為N的不包含重複英文字母(區別大小寫)的字串。

輸出格式:

輸出為一個整數,即該二叉樹的高度。

輸入樣例:

9
ABDFGHIEC
FDHGIBEAC

輸出樣例:

5

#include<iostream>
#include<string>
#include<vector>
#include<stack>

using namespace std;
char pre[1000],in[1000], tree[10000000];
void build(int prel, int prer, int inl, int inr, int root) {
    if (inr == inl) {
        tree[root] = in[inl];
        return;
    }
    tree[root] = pre[prel];
    int k = 0, llen = 0, rlen = 0;
    for (int i = inl; i <= inr; i++)
        if (pre[prel] == in[i])
            k = i;
    llen = k - inl;
    rlen = inr - k;
    if(llen>0)  build(prel + 1, prel + llen, inl, k - 1, root *2);
    if (rlen>0) build(prel + llen + 1, prel+llen+rlen, k + 1, inr, root *2+1);
}
int GetHeight(int root) {
    if (!tree[root]) return 0;
    else {
        int z = GetHeight(root * 2);
        int r = GetHeight(root * 2 + 1);
        if (z > r) return z + 1;
        else return r + 1;
    }
        return 0;
}
int main() {
    int n = 0;
    cin >> n;
    for (int i = 0; i < n; i++) 
        cin >> pre[i];
    for (int i = 0; i < n; i++)
        cin >> in[i] ;
    build(0, n - 1, 0, n - 1, 1);
    cout << GetHeight(1);
        return 0;
}