Problem Description
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
Input
输入数据有多组,每组数据第一行输入
1
个正整数
N(1 <= N <= 50)
为树中结点总数,随后
2
行先后给出先序和中序遍历序列,均是长度为
N
的不包含重复英文字母
(
区分大小写
)
的字符串。
Output
输出一个整数,即该二叉树的高度。
Example Input
9 ABDFGHIEC FDHGIBEAC
Example Output
5
//还原二叉树详解;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std ;
//结构体;
struct stu
{
char data ;
struct stu *lchild ;
struct stu *rchild ;
};
//还原二叉树;
void creat(struct stu *&p , int n , char a[] , char b[])
{
if(n==0)
p = NULL ;
else
{
p = (struct stu *)malloc(sizeof(struct stu)) ;
p -> data = a[0] ;
int i ;
for(i=0;b[i]!='\0';i++) //不能在for中定义int i,这样下面的程序没办法用i了,因为在for中定义的i,只能在for中使用,要想在别的地方或者在下面用,那么就要在for外面定义,就如int i; for();
if(b[i]==a[0])
break;
creat(p->lchild,i,a+1,b) ;
creat(p->rchild,n-i-1,a+i+1,b+i+1) ;
}
}
//二叉树的高度;
int get_gaodu(struct stu *&p)
{
if(p!=NULL)
{
int a = get_gaodu(p->lchild) ;
int b = get_gaodu(p->rchild) ;
if(a>b)
return a+1;
else
return b+1;
}
else
return 0 ;
}
//主函数 ;
int main()
{
int n ;
char a[100010] , b[100010] ;
while(~scanf("%d",&n))
{
int sum = 0 ;
cin >> a >> b ;
struct stu * p ;
creat(p,n,a,b);
sum = get_gaodu(p) ;
cout << sum << endl ;
}
return 0 ;
}