给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
代码如下:同学们直接复制是不行了,记到解水印,但是你水印都不会解的话,那答案。。。。。。。。。。。。。。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
char data;
struct node *left,*right;
}*Tree;
//递归创建树
Tree createTree(char *pre,char *ino,int n){//传入先序变量,中序遍历,和有多少个元素
Tree root=NULL;//初始话双亲节点
int i=0;//定义一个初始化值为0的计数器
int pl=0,pr=0;//初始化先序的左孩子数和右孩子数
int il=0,ir=0;//初始化中序的左孩子数和右孩子数
char lpre[50],rpre[50];//定于先序左,右孩子的分别所占的总个数
char lino[50],rino[50];//定于先序左,右孩子的分别所占的总个数
if(n==0){
return NULL;//如果传入的总个数为0返回NULL
}
root=(Tree)malloc (sizeof(struct node));//申请存储空间
if(root==NULL){
return NULL;//返回为空
}
memset(root,0,sizeof(struct node));
root->data=pre[0];//先序的第一个是根节点
//将中序遍历分割为两个数组
for(i=0;i<n;i++){
if((i<=il)&&(ino[i]!=pre[0])){//得到左孩子的数
lino[il++]=ino[i];//左孩子装到左数组中
}else if(ino[i]!=pre[0]){
rino[ir++]=ino[i];//右孩子装到左数组中
}
}
//由于左右孩子的个数相同,所以可以得到分割后的先序数组
for(i=1;i<n;i++){
if(i<(il+1)){
lpre[pl++]=pre[i];//将左孩子装在一个数组中
}else{
rpre[pr++]=pre[i];//将右孩子装在一个数组中
}
}
root->left=createTree(lpre,lino,il);//创建左边孩子
root->right=createTree(rpre,rino,ir);//创建右孩子
return root;//返回根结点
}
//先序遍历,底层为递归算法
void preorder(Tree b){
if(b==NULL){
return ;
}else{
printf("%c",b->data);//输出对应的结果
preorder(b->left);//向左递归查找
preorder(b->right);//向右递归查找
}
}
//计算树的高度是多少
int highTree(Tree b){
int left=0,max=0,right=0;//初始化左,最大值,右指数为0
if(b){
left=highTree(b->left);//递归调用该方法
right=highTree(b->right);//递归调用该方法
max=(left>right)?left:right;//比较两个的大小
return (max+1);//返回最大值
}else{
return 0;//失败返回0
}
}
int main(){
char preNode[50];
char inNode[50];
int n = 0; //用来统计数
int count=0;
char ch;
scanf("%d",&count);
Tree root=NULL;
getchar();//吃空格
while((ch = getchar())&&ch!='\n')
preNode[n++] = ch;
n = 0; //初始化,为下一次计数做准备
while((ch = getchar())&&ch!='\n')
inNode[n++] = ch;
root = createTree(preNode,inNode,n);
// preorder(root); //打印输出
int max=0;
max=highTree(root);//得到树的高度
printf("%d",max);//打印树的高度
return 0;
}