题目描述
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入
输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串。
输出
输出一个整数,即该二叉树的高度。
示例输入
9
ABDFGHIEC
FDHGIBEAC
示例输出
5
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
typedef char telement;
typedef struct BNote
{
char data;
struct BNote *lchild,*rchild;
}*BiTree;
telement pre[55],ino[55];
int i;
int Search(char str[51],char m)//查找字符在字符串中的位置;
{
for(i=0;str[i]!='\0';i++)
{
if(str[i]==m)
return i;
}
return -1;
}
void CrtBT(BiTree &T,char pre[],char ino[],int ps,int is,int n)//由先序序列中序序列建树;
{//ps前序序列的起始位置,is中序序列的起始位置;n为中序序列的长度;
if(n==0) T=NULL;
else
{
int k;
k=Search(ino,pre[ps]);
if(k==-1) T=NULL;
else
{
T=new BNote;
if(!T) exit(0);
T->data=pre[ps];
if(k==is) T->lchild=NULL;
else
CrtBT(T->lchild,pre,ino,ps+1,is,k-is);//注意前后序的初始位置的变化,中序序列的长度变化
if(k==is+n-1) T->rchild=NULL;
else
CrtBT(T->rchild,pre,ino,ps+1+(k-is),k+1,n-(k-is)-1);//注意前后序的初始位置的变化,中序序列的长度变化
}
}
}
int depth(BiTree T)//树的深度;
{
int lth,rth;
if(!T) return 0;
else
{
lth=depth(T->lchild);
rth=depth(T->rchild);
if(lth>rth)
return lth+1;
return rth+1;
}
}
int main()
{
int n;
BiTree T;
while(~scanf("%d",&n))
{
scanf("%s",pre);
scanf("%s",ino);
CrtBT(T,pre,ino,0,0,n);
printf("%d\n",depth(T));
}
return 0;
}
本文介绍了一种通过给定的二叉树先序遍历和中序遍历序列来计算二叉树高度的方法。利用递归算法构建二叉树,并通过深度优先搜索计算树的最大高度。
2143

被折叠的 条评论
为什么被折叠?



