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

输入格式:

输入首先给出正整数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;
}

 

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐