#include <bits/stdc++.h>
using namespace std;
char pre[50],ino[50];//定义全局变量
typedef struct btnode{ //定义树的结构体
char data;
struct btnode *lchil,*rchil;
}btnode,*btree;
btree buildetree(int root,int start,int end);//root为根结点,start为中序的开始,end为中序的结束
int Gethight(btree t);
int main(){
btree t;
int N; cin>>N;
int i,j;
for(i=0;i<N;i++){
char x; cin>>x;
pre[i] = x;
}
for(j=0;j<N;j++){
char x; cin>>x;
ino[j] = x;
}
t = buildetree(0,0,N-1);
cout<<Gethight(t)<<" ";
}
btree buildetree(int root,int start,int end){
if(start>end) return NULL;
btree t;
int i;
for(i=start;i<=end;i++){ //每次递归start在变所以不从0开始;
if(pre[root]==ino[i]) //找到根节点在中序中的位置i
break;
}
t = new btnode; //分配空间
t->data = pre[root];
t->lchil = buildetree(root+1,start,i-1);//先序看出A的左子树根节点位置为root+1;从中序看出A的
//左子树的开始就是start,结束为A的前一个位置即为i-1;
t->rchil = buildetree(root+i-start+1,i+1,end);//A的左子树共有i-start个根节点(不用+1因为A不
//在内)所以A右子树根节点为root+i-start+1,中序右子树开始为i+1,结束为end
return t;
}
int Gethight(btree t){
if(t==NULL) return 0;
int left = Gethight(t->lchil); //递归求左子树;
int right = Gethight(t->rchil);//递归求右子树
return max(left,right)+1;
}
先序:A __ ___ 中序 __ A ___
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
4-14 还原二叉树 (15分) 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的
最新推荐文章于 2022-10-17 10:14:13 发布