【树的应用】——还原二叉树 (25分)

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

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

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

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

5

我也是奇了怪了,一直段错误,我还没发现问题,总觉得是cin和字符之间的问题,使用了getchar也不对,很纳闷,我好像一直对getchar和cin等这些没弄太清,看来有必要系统查询学习一下了。觉得没啥问题,试了试scanf,就过了,这就更让我怀疑了。。。
求解二叉树的高度,首先要根据前序和中序得到二叉树,前序序列的第一个就是根结点,再用同样的方式递归构造左子树和右子树,注意递归时元素个数的改变和指针的改变,树的题离不开递归可以说,毕竟它本身就是一个递归的定义。求解树的高度,也是递归,若为空,则为0,否则为左右子树高度的最大值+1

下面的两篇博文分别是通过前序和中序得到二叉树和通过中序和后序得到二叉树以及构造完成之后的例子
天梯赛&&HBU训练营——玩转二叉树 (25分)

天梯赛&&HBU训练营——树的遍历 (25分)

#include <iostream>
#include <cstdlib>
using namespace std;

typedef struct Node{
	char data;
	struct Node *left,*right;
}Node,*Tree;

Tree create(int n,char *pre,char *mid){
	if(n==0)
		return NULL;
	Tree tree = (Node *)malloc(sizeof(Node));
	tree->data = pre[0];
	tree->left = tree->right = NULL;
	int i;
	for(i = 0;i<n;i++){
		if(mid[i]==pre[0])
			break;
	}
	tree->left = create(i,pre+1,mid);
	tree->right = create(n-i-1,pre+i+1,mid+i+1);
	return tree;
}

int getHeight(Tree tree){
    int m;
	if(!tree)
		return 0;
	int left = getHeight(tree->left);
	int right = getHeight(tree->right);
    m = left>right?left:right;
	return m + 1;
} 

int main(){
	ios::sync_with_stdio(false);
	char pre[55],mid[55];
	int n;
	scanf("%d",&n);
	getchar();
	for(int i=0;i<n;i++){
		scanf("%c",&pre[i]);
	}
	getchar();
	for(int i=0;i<n;i++){
		scanf("%c",&mid[i]);
	}
	Tree tree = create(n,pre,mid);
	int h = getHeight(tree);
	cout << h;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_45845039/article/details/108031673