数据结构作业3-4(周)问题D:二叉树问题

/发布此文的今天是哈工大100周年校庆,今天被朋友圈的哈工大校庆刷屏了。东北学子祝愿那个在红博广场转盘道附近的在西大直街的地铁一号线上的旁边是哈尔滨铁路局的公交94路能到站的马家沟河旁的哈工大(圣•马家沟男子职业技术学院)越办越好!规格严格,功夫到家!/

题目描述

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

输入

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

输出

对于每组输入,输出一个整数,即该二叉树的高度。

样例输入

9
ABDFGHIEC
FDHGIBEAC
7
Abcdefg
gfedcbA

样例输出

5
7

我的Tips:我本来以为还是真的创建个树去做,结果发现了某位大大更加厉害的做法,经过一些更删改使得更加贴合作业的要求

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

int calculate(char* xian,char* zhong,int n)             //求二叉树的高度
{   	if(n == 0)  { return 0;}                  //若没有结点,为空树;但实际上这个步骤可以省略了,因为输入时限定不能输入0      
	int i;    
 	for(i = 0; i < n; i++)    
 	{  if(zhong[i] == xian[0])                //找到根结点在中序的位置        
  		{break;}    
 	}
 	/*之后根据先序和中序的特点,我们就可以隔开分治了
	  在先序序列中,下标1~i是该根节点左树的范围
	  在中序序列中,i+1到之后的n-i-1是右树范围
	*/
        int left = calculate(xian+1,zhong,i);           //左子树的深度,使用递归    
 	int right = calculate(xian+i+1,zhong+i+1,n-i-1);//右子树的深度,使用递归
 	return max(left,right)+1;                 //返回左右子树深度的较大值中的较大值+根结点的1次
}
int main()
{ 	int n;    
 	while(cin>>n&&n)    
 	{ 
        	char xian[n+1],zhong[n+1];        //先序数组和中序数组    
  		cin >> xian >> zhong;    	  //输入相应的字符串
  		cout << calculate(xian,zhong,n) << endl;//输出答案
  		memset(xian,' ',sizeof(xian));    //清空数组,准备下一次接收
  		memset(zhong,' ',sizeof(zhong));
 	}    
	return 0;
}

引例中树的实际样貌在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值