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

一、题目描述

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

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

输入

测试数据有多组
对于每组测试数据,首先输入一个整数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
    评论
完全二叉树是一种特殊的二叉树,它的所有叶子节点都在同一层上,除了最后一层,其他层的节点数都是满的。在完全二叉树,新节点应该从最后一层的最左边开始添加,如果最后一层已经满了,则新节点应该添加到下一层的最左边。下面是Python实现完全二叉树添加节点的示例代码: ```python class Node: def __init__(self, val): self.val = val self.left = None self.right = None class CompleteBinaryTree: def __init__(self): self.root = None def add_node(self, val): new_node = Node(val) if not self.root: self.root = new_node return queue = [self.root] while queue: cur_node = queue.pop(0) if not cur_node.left: cur_node.left = new_node return elif not cur_node.right: cur_node.right = new_node return else: queue.append(cur_node.left) queue.append(cur_node.right) ``` 在这个示例代码,我们定义了一个Node类来表示二叉树的节点,以及一个CompleteBinaryTree类来表示完全二叉树。在add_node方法,我们首先创建一个新节点,然后判断根节点是否为空,如果为空,则将新节点设置为根节点。如果根节点不为空,则将根节点添加到队列,然后进行循环。在循环,我们从队列弹出当前节点,然后检查它的左右子节点是否为空。如果左子节点为空,则将新节点添加为左子节点,否则,如果右子节点为空,则将新节点添加为右子节点。如果左右子节点都不为空,则将左右子节点添加到队列,以便在下一次循环处理它们。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值