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

一、题目描述

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

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

输入

测试数据有多组
对于每组测试数据,首先输入一个整数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;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值