还原二叉树

分数 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;
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值