分数 15
全屏浏览题目
切换布局
作者 DS课程组
单位 浙江大学
给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。
输入格式:
输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。
输出格式:
输出为一个整数,即该二叉树的高度。
输入样例:
9
ABDFGHIEC
FDHGIBEAC
输出样例:
5
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
AC:
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 51;
int n;
char Pre[MAXN], In[MAXN];//字符类型
//建立结构体
typedef struct TreeNode {
char Data;
TreeNode* Left;
TreeNode* Right;
}*BiTree;
//建立一个二叉树
BiTree CreateBiTree(char *Pre, char *In, int Len) { //Pre为先序第一个 In为中序第一个 Len为长度
BiTree T;
int i;
if (!Len) return NULL;//树为空
T = (TreeNode *)malloc(sizeof(struct TreeNode));//申请空间
T->Data = Pre[0];//树的根节点数据为先序的第一个元素
for (i = 0; i < Len; i++)//遍历中序找出根节点的值
if (Pre[0] == In[i]) break;
T->Left = CreateBiTree(Pre + 1, In, i);//递归左子树
T->Right = CreateBiTree(Pre + i + 1, In + i + 1, Len - i - 1);//递归右子树
//上面两步见下图
return T;//返回建立的二叉树
}
//先求出左右子树的高度,找出最大值 加一即为整棵树的高度 顺序为左右递归加上根的一层即左右根采用后序遍历
int PostOrderGetHeight(BiTree T) {
int TH, LH, RH;//分别定义树、左子树、右子树的高度
if (!T) TH = 0;//树为空输出零
else
{
LH = PostOrderGetHeight(T->Left);//递归求左子树的高度
RH = PostOrderGetHeight(T->Right);//递归求右子树的高度
TH= max(LH, RH) + 1;//整棵树的高度为左右子树种的最大值加上1(根节点那一层)
}
return TH;//返回高度
}
int main()
{
cin >> n;
//%s通过空格或换行来识别一个字符串的结束 只能输入用不能输出用
scanf("%s\n%s", Pre, In);//输入先序和中序
BiTree T = NULL;
T = CreateBiTree(Pre, In, n);//传入先序 中序 长度
int h = PostOrderGetHeight(T);//输出高度
cout << h;
}