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;
}