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

猜你喜欢

转载自blog.csdn.net/lannister_awalys_pay/article/details/84404520