数据结构实验之二叉树四:还原二叉树
Time Limit: 1000MS
Memory Limit: 65536KB
Problem Description
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
Input
输入数据有多组,每组数据第一行输入
1
个正整数
N(1 <= N <= 50)
为树中结点总数,随后
2
行先后给出先序和中序遍历序列,均是长度为
N
的不包含重复英文字母
(
区分大小写
)
的字符串。
Output
输出一个整数,即该二叉树的高度。
Example Input
9 ABDFGHIEC FDHGIBEAC
Example Output
5
Hint
Author
xam
<pre name="code" class="cpp">#include <iostream>
#include <cstdio>
using namespace std;
struct tree {
char data;
tree *l, *r;
};
char a[50+5], b[50+5];
int n, ans;
tree *creat(int s1, int e1, int s2, int e2) {
tree *root;
int i=s2;
while(i<=e2) {
if(b[i]==a[s1])
break;
i++;
}
if(s1==e1&&s2==e2&&a[s1]==b[s2]) {
root=new tree;
root->data=a[s1];
root->l=NULL;
root->r=NULL;
}
else if(i>e2) root=NULL;
else {
root=new tree;
root->data=a[s1];
root->l=creat(s1+1,s1+i-s2,s2,i-1);
root->r=creat(s1+i-s2+1,e1,i+1,e2);
}
return root;
}
void pre_order(tree *root) {
if(root) {
printf("%c", root->data);
if(root->l)
pre_order(root->l);
if(root->r)
pre_order(root->r);
}
}
void tree_height(tree *root,int h) {
if(h>ans) ans=h;
if(root->l) tree_height(root->l,h+1);
if(root->r) tree_height(root->r,h+1);
}
int main()
{
while(~scanf("%d", &n)) {
scanf("%s %s", a, b);
tree *root=creat(0,n-1,0,n-1);
//pre_order(root);
//printf("*\n");
ans=1;
tree_height(root,1);
printf("%d\n", ans);
}
return 0;
}