Problem Description
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
Input
输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串。
Output
输出一个整数,即该二叉树的高度。
Example Input
9 ABDFGHIEC FDHGIBEAC
Example Output
5
通过先序遍历序列和中序遍历序列还原二叉树,先序遍历序列的第一个值肯定为根结点,在中序遍历序列中找到该值,该值的左侧所有的值即为左子树,右侧为右子树,后分别对左侧和右侧进行递归。
代码:
#include <bits/stdc++.h>
#include <string.h>
using namespace std;
int cnt, k, n;
char a[51], b[51];
struct node
{
char data;
struct node *l, *r;
};
struct node *create(char a[], char b[], int n)
{
struct node *root;
root = (struct node*)malloc(sizeof(struct node));
if(n==0)
return NULL;
root->data = a[0];
char *p;
for(p=b; p!='\0'; p++) // 在中序遍历序列中找到先序遍历序列的第一个值(根结点)
if(*p==a[0])
break;
int t;
t=p-b; //t为左侧子树包含的结点个数
root->l=create(a+1, b, t); //对根结点左侧序列进行遍历
root->r=create(a+t+1, p+1, n-t-1); //对根结点右侧序列进行遍历
return root;
}
int deep(struct node *root)
{
int d=0;
if(root)
{
int l1=deep(root->l);
int l2=deep(root->r);
if(l1>l2)
d=l1+1;
else d=l2+1;
}
return d;
}
int main()
{
while(~scanf("%d", &n))
{
scanf("%s", a);
scanf("%s", b);
struct node *root;
root = create(a, b, n);
int m;
m = deep(root);
cout << m << endl;
}
return 0;
}