二叉树的还原

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

输入格式:

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

输出格式:

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

输入样例:

9
ABDFGHIEC
FDHGIBEAC

输出样例:

5


先序遍历的顺序为:根->左子树->右子树

中序遍历的顺序为:左子树->根->右子树

后序遍历的顺序为:左子树->右子树->根


这里用到了全局变量定义数组,从而在递归时只需要传递下标值而无需传递数组。

因为本题就是求高度,不涉及节点的数据,所以没有必要在结构体中定义data,需要建立树的结构即可。

先序第一个数据必是树根,通过检索其在中序数组中的位置,将中序数组划分为左子树和右子树,同时根据左右字数节点的个数,将先序序列划分为左右子树。这样进行完一次的划分后,就确定了左右子树的先序和中序顺序,利用递归将其划分下去。同时需要考虑何时不会有左右子树,答案显而易见,就是利用根把中序数组划分后无剩余元素。


#include<stdio.h>
#include<stdlib.h>

typedef struct node* Ptr;
struct node{
	Ptr left;
	Ptr right;
};

char pre[50],in[50];
int num;

//四个参数分别为先序、中序数组下标的最小、最大值 
Ptr Restore( int preMin, int preMax, int inMin, int inMax);
int GetHeight( Ptr head);

int main(void){
	Ptr BT;
	int height;
	scanf("%d", &num);
	scanf("%s", pre);
	scanf("%s", in);
	BT = Restore( 0, num - 1, 0, num - 1);
	height = GetHeight( BT);
	printf("%d", height);
	return 0;
}

Ptr Restore( int preMin, int preMax, int inMin, int inMax){
	Ptr root;
	int i;
	root = (Ptr)malloc(sizeof(struct node));
	root->left = root->right = NULL;
	for( i = inMin; i <= inMax; i++){
		if( pre[preMin] == in[i]){
			if( i != inMin) root->left = Restore( preMin + 1, preMin + inMin - 1, inMin, i - 1); //在子树有剩余的
			if( i != inMax) root->right = Restore( preMin + i - inMin + 1, preMax, i + 1, inMax);//进情况下行操作 
			break;
		}
	}
	return root;
}

int GetHeight( Ptr head){
	int hl, hr, max;
	if( head == NULL) return 0;
	else{
		hl = GetHeight( head->left);
		hr = GetHeight( head->right);
		max = hl > hr ? hl : hr;
	}
	return max + 1;
}




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值