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