[数据结构—— 二叉树的中后序遍历构建及求叶子]

245 阅读1分钟

哈喽哈喽,这里是小菜不拖延博主!

题目描述

按中序遍历和后序遍历给出一棵二叉树,求这棵二叉树中叶子节点权值的最小值。

输入保证叶子节点的权值各不相同。

输入

测试数据有多组 对于每组测试数据,首先输入一个整数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.利用后序根节点,在中序当中找到根节点的位置,此时中序当中根节点的左边就是左子树,右边就是右子树

首先很重要的一个事情就是区分好我们要干什么,每一步需要做什么。

左子树就是左子树,右子树就是右子树。

我们需要传四个参数,

中序遍历当中,下一颗树的范围,也就是左右的值

拿到这个左右的值,就可以方便我们去看这一棵树在后序遍历当中的范围,然后又可以找到他的根

image.png

代码

#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;
}