7-23 还原二叉树 (25 分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数 N ( ≤ 50 ) N(≤50) N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为 N N N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
My code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX 500
int search(int *a, int x, int N)
{
for(int i=0; i<N; i++){
if(a[i]==x) return i;
}
return -1;
}
void buildtree(int length, int i, int *pre, int *in, double *max)
{
if(length==0) return;
int root = pre[0];
//T[i] = root;
if(i>*max) *max=i;
int rootin = search(in, root, length);
int Llength, Rlength;
Llength = rootin;
Rlength = length-1-Llength;
buildtree(Llength, 2*i, pre+1, in, max);
buildtree(Rlength, 2*i+1, pre+Llength+1, in+rootin+1, max);
}
int main(void)
{
int N;
scanf("%d", &N);
int pre[MAX+1], in[MAX+1];
getchar();
for(int i=0; i<N; i++){
pre[i] = getchar()-'A';
}
getchar();
for(int i=0; i<N; i++){
in[i] = getchar()-'A';
}
double ans=1;
buildtree(N, 1, pre, in, &ans);
ans = log(ans)/log(2)+1;
printf("%d\n", (int)ans);
return 0;
}
注:尝试用非递归写但是最后发现想法不对,用递归写很简单。
参考:(https://blog.csdn.net/m0_37698652/article/details/79218014)