给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
#include<iostream>
using namespace std;
typedef struct BiTNode{
char c;
struct BiTNode *lchild;
struct BiTNode *rchild;
}BiTNode,*BiTree;
BiTree Build(char *pre,char *in,int n){
if(n <= 0)
return NULL;
BiTree T = new BiTNode;
T->c = *pre;
char *p = in;
while(p){//找到根节点在中序中的指针
if(*p == *pre)
break;
p++;
}
int len = p - in; //确定左子树的长度,使用指针相减,不是用n - p,用指针!指针!指针!
//左子树
T->lchild = Build(pre + 1,in,len);//第一个参数和第二个参数是指针!指针!指针!,第三个参数是常数
//右子树
T->rchild = Build(pre + 1 + len,p+1,n - len - 1);//第一个参数和第二个参数是指针!指针!指针!,第三个参数是常数
return T;
}
int Hight(BiTree T){
if(!T)
return 0;
int m = Hight(T->lchild);
int n = Hight(T->rchild);
if(m > n)
return ++m;
else
return ++n;
}
int main(){
int n,h;
char pre[51],in[51];
BiTree T;
scanf("%d%s%s",&n,&pre,&in);//字符串型不需要清除输入缓冲区的字符
T = Build(pre,in,n);
h = Hight(T);
printf("%d\n",h);
return 0;
}