数据结构实验之二叉树四:还原二叉树
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
#include <iostream>
#include <string>
using namespace std;
struct Btree
{
Btree*left;
Btree*right;
char data;
};
string s1,s2;
Btree*build(string s1,string s2,int n)//建树的理解:http://blog.csdn.net/droidphone/article/details/38063897
{
int i;
if(n==0)
return NULL;//递归结束边界
Btree*root;
root=new Btree;
root->data=s1[0];
for(i=0;i<n;i++)
{
if(s2[i]==root->data)
{
break;
}
}
root->left=build(s1.substr(1),s2,i);//参数中的i和n-1-i:需要填充到root的剩余左右子树的长度
root->right=build(s1.substr(1+i),s2.substr(1+i),n-1-i);//ss=s.substr(start,(N));ss=s.substring(start,end);返回指定位置的字符串
return root;
}
int Depth(Btree*root)
{
if(root==NULL)
return 0;
else
{
int n1,n2;
n1=Depth(root->left);
n2=Depth(root->right);
return n1>n2?n1+1:n2+1;
}
}
int main()
{
int n;
while(cin>>n)
{
Btree*root;
cin>>s1;
cin>>s2;
root=build(s1,s2,n);
int d=Depth(root);
cout<<d<<endl;
}
return 0;
}