给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
代码:
#include<stdio.h>
#include<stdlib.h>
#define MAXN 51
typedef struct TreeNode *BinTree;
struct TreeNode{
char Data;
BinTree Left;
BinTree Right;
};
BinTree CreateBinTree(char *Pre, char *In, int Len);//根据先序遍历和中序遍历序列构建二叉树
int Height(BinTree T);//求树高
int main()
{
int N;
char Pre[MAXN], In[MAXN];
BinTree T = NULL;
scanf("%d",&N);
scanf("%s\n%s",Pre, In);
T = CreateBinTree(Pre, In, N);
printf("%d\n",Height(T));
return 0;
}
BinTree CreateBinTree(char *Pre, char *In, int Len){
BinTree T;
int i;
if(!Len) return NULL;//递归基
T = malloc(sizeof(struct TreeNode));
T->Data = Pre[0];//当前节点数据为前序遍历第一个元素
for(i=0;i<Len;i++)//中序遍历中找根节点
if(Pre[0]==In[i]) break;
T->Left = CreateBinTree(Pre+1, In, i);//左子树的先序遍历起始点即为当前先序遍历的下一位置,中序遍历起始位置不变,长度为中序遍历根节点左侧部分
T->Right = CreateBinTree(Pre+i+1, In+i+1, Len-i-1);//右子树先序遍历起始点为当前先序遍历左子树之后部分,中序同,长度为当前长度减左子树减1(当前节点)
return T;
}
int Height(BinTree T){
int THeight, LHeight, RHeight;
if(!T) THeight = 0;//递归基
else{
LHeight = Height(T->Left);
RHeight = Height(T->Right);
THeight = (LHeight>RHeight) ? LHeight : RHeight;
THeight++;//树高为左右子树树较高者+1
}
return THeight;
}
本文介绍了一种通过先序和中序遍历序列构建二叉树,并计算其高度的方法。利用递归创建二叉树结构,再通过递归计算树的高度。
862

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



