4-14 还原二叉树 (15分)
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
Code:
使用两个板子:先序和中序建树+求高度
先序和中序建树板子理解BTree buildtree(int root,int start,int end)
:
先序(根左右)最先出现的总是根结点,
root
为当前先序的根结点下标(根据当前的中序序列可以把当前的中序分为左根右)
start
为当前中序序列起始位置
end
为当前中序序列结束位置
k
为当前中序序列的根结点位置,分割当前中序序列左右子树的下标
#include<bits/stdc++.h>
using namespace std;
typedef struct btnode{
char data;
struct btnode *left,*right;
}btnode,*BTree;
vector<char> pre,in;
BTree buildtree(int root,int start,int end){
if(start>end) return NULL;
int k;
for(k=start;k<end;k++) if(in[k]==pre[root]) break;
BTree node = (BTree)malloc(sizeof(btnode));
node->data = pre[root];
node->left = buildtree(root+1,start,k-1);
//当前中序序列的左子树,root+1为当前中序左子树的根结点位置
node->right = buildtree(root+1+k-start,k+1,end);
//当前中序序列的右子树,root+1为当前中序左子树的根结点位置,k-start为当前中序序列左子树的个数,相加为当前中序序列右子树的根结点位置
return node;
}
int getHeight(BTree bt){
if(!bt) return 0;
int left = getHeight(bt->left);
int right = getHeight(bt->right);
return max(left,right)+1;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int N;
scanf("%d",&N);getchar();
pre.resize(N);
in.resize(N);
for(int i=0;i<N;i++) scanf("%c",&pre[i]);
getchar();
for(int i=0;i<N;i++) scanf("%c",&in[i]);
BTree t = buildtree(0,0,N-1);
cout << getHeight(t);
return 0;
}