一、题目描述
按中序遍历和后序遍历给出一棵二叉树,求这棵二叉树中叶子节点权值的最小值。
输入保证叶子节点的权值各不相同。
输入
测试数据有多组
对于每组测试数据,首先输入一个整数N (1 <= N <= 10000),代表二叉树有N个节点,接下来的一行输入这棵二叉树中序遍历的结果,最后一行输入这棵二叉树后序遍历的结果
输入一直处理到文件尾(EOF)
输出
对于每组测试数据,输出一个整数,代表二叉树中叶子节点权值最小值
样例
7
3 2 1 4 5 7 6
3 1 2 5 6 7 4
8
7 8 11 3 5 16 12 18
8 3 11 7 16 18 12 5
1
255
255
输出
1
3
255
二、解题
1.后序的最后一个就是根节点
2.利用后序根节点,在中序当中找到根节点的位置,此时中序当中根节点的左边就是左子树,右边就是右子树
首先很重要的一个事情就是区分好我们要干什么,每一步需要做什么。
左子树就是左子树,右子树就是右子树。
我们需要传四个参数,
中序遍历当中,下一颗树的范围,也就是左右的值
拿到这个左右的值,就可以方便我们去看这一棵树在后序遍历当中的范围,然后又可以找到他的根
三、代码
#include<iostream>
#include<cstring>
using namespace std;
int mid[10010];
int las[10010];
int root;
int ml, mr, ll, lr;
int mmin;
void build(int ml,int mr,int ll,int lr)
{
if (ml == mr)
{
if (mmin > las[lr])
mmin = las[lr];
return;
}
for (int i = ml;i <= mr; i++)//在中序遍历的范围当中,寻找根节点,根节点就是后续遍历的最后一个,下标就是右边界
{
if (mid[i] == las[lr])
{
build(ml,i-1,ll,ll+i-ml-1);//左子树(中序左边界,中序右边界,后序左边界,后序右边界)长度i-ml
//我拿到中序当中的长度是为了在后续当中确定范围,
build(i+1,mr, ll + i - ml,lr-1);//右子树
}
}
}
int main()
{
int t;
while (cin >> t)
{
for (int i = 0; i < t; i++)
{
cin >> mid[i];
}
for(int i=0;i<t;i++)
{
cin >> las[i];
}
mmin = 100000000;
build(0, t - 1, 0, t - 1);
cout << mmin << endl;
memset(mid, 0, sizeof mid);
memset(las, 0, sizeof las);
}
return 0;
}