7-23 还原二叉树

给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度。

输入格式:

输入首先给出正整数N(≤50),为树中结点总数。下面两行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区别大小写)的字符串。

输出格式:

输出为一个整数,即该二叉树的高度。

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

5

解题思路:

 这道题主要是用到了一些规律:

先序遍历序列和中序遍历序列一起就能唯一确定一棵二叉树,并且对于每一个子树来说,先序遍历的第一个元素就是树的根节点,然后根据这个根节点在中序序列中的位置就能确定其左右两棵子树。我们只需要递归遍历二叉树的所有子树,然后选择左右子树中高的那棵子树的高度返回即可。

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define MAXSIZE 110

//a是先序遍历序列,b是中序遍历序列
//n是子树的总结点数 
int getDeep(char a[], char b[], int n){
	//首先找到中序遍历的根节点
	if(n==0) return 0;	//递归退出点 
	int idx=0;
	for(; idx<n; idx++){
		if(a[0] == b[idx]){
			break;
		}
	} 
	//此时idx指向的b中的结点就是树的根节点,接下来需要递归判断左右子树哪个高,返回高的那个值
	int left = getDeep(a+1, b, idx)+1;
	//这里比较难理解,实际上在中序遍历的时候左子树有多少个结点,那么先序遍历后序的多少个结点也是左子树 
	int right = getDeep(a+idx+1, b+idx+1, n-idx-1)+1; 
	int max = left;
	if(right>left){
		max = right;
	}
	return max;
} 

int main(){
	char a[MAXSIZE];
	char b[MAXSIZE];
	int n;
	scanf("%d", &n);
	cin >> a;
	cin >> b;
	printf("%d", getDeep(a, b, n));
	return 0;
}

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值