/发布此文的今天是哈工大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;
}
引例中树的实际样貌