7-38 还原二叉树 (25分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
struct node{
char data;
node *left;
node *right;
} *head;
typedef node* Node;
int n;
char a[55];
char b[55];
void insert(Node &p,Node &h){
//插入结点 ,使用引用做形参,否则无法有效连接结点
if(h==NULL){//节点为空,插入
h=p;
return ;
}
int ai,bi;
for(int i=0;i<n;i++){
if(b[i]==p->data){//待插入字符在中序遍历的位置
ai=i;
break;
}
}
for(int i=0;i<n;i++){
if(b[i]==h->data){//根节点在中序遍历的位置
bi=i;
break;
}
}
if(ai<bi){//在根节点左边,插入到左子树
insert(p,h->left);
}
else{//在根节点右边,插入到右子树
insert(p,h->right);
}
}
void create(){//建树
for(int i=0;i<n;i++){
node *p=(node *)malloc(sizeof(node));
p->data=a[i];
p->left=NULL;
p->right=NULL;
insert(p,head);//插入结点
}
}
int level(node *p,int cur){//求树的深度,总深度从1开始
if(p==NULL){//节点为空,返回当前深度
return cur;
}
else{//左子树不为空,左子树深度加一,遍历左子树,右子树同理
return max(level(p->left,cur+1),level(p->right,cur+1));
//返回左、右子树中深度的最大值
}
}
int main(){
head=NULL;
scanf("%d",&n);
getchar();//吃掉换行符
scanf("%s",a);//读取先序遍历
scanf("%s",b);//读取中序遍历
create();//建树
printf("%d",level(head,0));
return 0;
}