数据结构实验之二叉树四:还原二叉树
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
求二叉树深度,高度的三种算法:
http://blog.csdn.net/qq_36525906/article/details/54973573
#include <bits/stdc++.h>
using namespace std;
struct Btree
{
char data;
struct Btree *lc,*rc;
};
char pre[10010];//前序序列
char mid[10010];//中序序列
int ans;
struct Btree* creat(int len, char *pre, char *mid)//二叉树的重建
{
struct Btree *root;
int i ;
if(len == 0)
{
return NULL;
}
root = new Btree;
root -> data = pre[0];//找到根节点(前序遍历的第一位)
for(i = 0; i < len; i++)//在中序序列中找到根节点的位置
{
if(mid[i] == pre[0])
break;
}
root -> lc = creat(i, pre + 1, mid);//递归遍历(左子树的长度,左子树在pre中开始位置的地址,左子树在mid中开始位置的地址)
root -> rc = creat(len-i-1, pre+i+1, mid+i+1);//(右子树的长度,右子树在pre中开始位置的地址,右子树在mid中开始位置的地址)
return root;
};
int height(struct Btree *root)//递归求树的高度
{
if(root)
{
int m = height(root -> lc);
int n = height(root -> rc);
return (m > n)?(m+1):(n+1);
}
else
return 0;
}
int main()
{
int n;
while(cin>>n)
{
cin>>pre>>mid;
int len = strlen(pre);
struct Btree *root;
root = creat(len,pre,mid);
int high = height(root);
cout<<high<<endl;
}
return 0;
}