首页 > 其他分享 >[刷题笔记] ybt 1364:二叉树遍历(flist)

[刷题笔记] ybt 1364:二叉树遍历(flist)

时间:2024-01-30 15:44:55浏览次数:17  
标签:遍历 int ybt pos flist bfs 二叉树 include

Problem_Link

Description

树和二叉树基本上都有先序、中序、后序、按层遍历等遍历顺序,给定中序和其它一种遍历的序列就可以确定一棵二叉树的结构。

假定一棵二叉树一个结点用一个字符描述,现在给出中序和按层遍历的字符串,求该树的先序遍历字符串。

Analysis

我们先前做过 给定前序中序求后序,核心思想是 找root,也就是树根,然后递归处理。不妨本题借鉴如上做法。

所谓 “层次序列”,实际上就是 bfs 序。通过 bfs 序,我们可以很轻松的找到树根。下方给出一个样例,编号为 bfs 序。

image

容易发现,当前的 root 即为当前 bfs 编号最小的数。找到树根后,和求后序同理,尝试在中序中找到该节点,将其分为左右两个子树。分别递归处理即可。

原理如上,实现的时候需要注意一些细节,具体如下。

  • 进行搜索树根的时候,如果搜到一个最小的树根,我们需要判断它是否在当前子树内,如果不在当前子树内则它不合法。就应当找另外一个根。

  • 递归搜索左右子树的时候,需要特判越界。否则会死循环。

AC Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
using namespace std;
const int N  = 10010;
string bet,bfs;
bool flag[N];
void dfs(int l,int r)
{
	int pos;
	for(int i=0;i<bfs.size();i++)
	{
		if(!flag[i])
		{
			for(int j=l;j<=r;j++)
			{
				if(bfs[i] == bet[j])
				{
					pos = j;
					flag[i] = 1;
					break;
				}
			}
			if(flag[i])
			{
				break;
			}
		}
	}
	cout<<bet[pos];
	if(l < pos && r > pos) 
		dfs(l,pos-1);
	if(r > pos)
		dfs(pos+1,r);
}
int main()
{
	freopen("input.txt","r",stdin);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>bet>>bfs;
	dfs(0,bet.size()-1);	
} 

标签:遍历,int,ybt,pos,flist,bfs,二叉树,include
From: https://www.cnblogs.com/SXqwq/p/17997253

相关文章

  • 二叉树(1)
    目录110平衡二叉树257二叉树的所有路径null前面一些简单题就没放上来,放的都是一开始没思路的110平衡二叉树显然这题不能单纯的返回truefalse还需要把这一层的高度接住所以用-1作为标识符,如果=-1说明下层已经有不平衡了,那么都返回-1否则就返回这棵树的高度classSolution{......
  • 【树】二叉树的应用 I
    目录1.题目列表2.应用2.1.Leetcode226.翻转二叉树2.1.1.题目2.1.2.解题思路2.1.2.1.方法一:前序遍历2.1.2.2.方法二:后序遍历2.1.3.代码实现2.2.Leetcode116.填充每个节点的下一个右侧节点指针2.2.1.题目2.2.2.解题思路2.2.2.1.方法一:广度优先搜索2.2.2.2.方法二:深......
  • 如何学习算法:什么时完全二叉树?完全二叉树有什么特点?
    完全二叉树我们知道树是一种非线性数据结构。它对儿童数量没有限制。二叉树有一个限制,因为树的任何节点最多有两个子节点:左子节点和右子节点。什么是完全二叉树?完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点从尽可能左侧填充之外。完全二叉树的......
  • 【树】二叉树的应用 I
    目录1.题目2.应用2.1.Leetcode124.二叉树中的最大路径和2.1.1.题目2.1.2.解题思路2.1.3.代码实现1.题目二叉树相关的题目:序号题目难度1124.二叉树中的最大路径和困难22.应用2.1.Leetcode124.二叉树中的最大路径和2.1.1.题目124.二叉树......
  • Ybt 金牌导航 6.1.H. 时空旅行 / P5416 [CTSC2016] 时空旅行(线段树分治+凸包)
    题意简述初始有版本\(0\),其中仅包含点\(0\),且\(c_0\)给出,\(x_0=0\)。对于第\(i\)个版本,它依赖第\(fr_i\)个版本,而且会在父级版本的基础上进行以下两种操作之一:插入一个新点,并且会给出\(x_i\)和\(c_i\)。删除一个本就存在的点(不为\(0\))给出\(m\)次询问,每次给出......
  • KY11 二叉树遍历C++
    这个题目思路其实就是先序遍历的变形。相当于沿着先序遍历的顺序跟着构建二叉树就行。然后中序遍历这个树。#include<iostream>#include<string>usingnamespacestd;structtnode{chardata;structtnode*left;structtnode*right;};typedefstructt......
  • KY212 二叉树遍历C++
    思路是先构造出树,然后在后序遍历整个树。#include<iostream>#include<string>usingnamespacestd;structTnode{chardata;structTnode*left;structTnode*right;};typedefstructTnodeTree;Tree*build(stringpre,inth1,intt1,stringin,inth2......
  • Ybt 金牌导航 6.3.A. 区间众数 / P4168 [Violet] 蒲公英(分块)
    题意简述多次查询区间\([l,r]\)的众数,若有多个取数值最小的。强制在线。\(n\le4\times10^4,m\le5\times10^4\)。分析考虑分块。首先预处理出块区间内的众数\(maj_{l,r}\)和每种数在某个块的前缀的出现次数\(cnt_{i,a_i}\),时空复杂度都是\(O(n\sqrtn)\)的。对于询......
  • Ybt 金牌导航 6.1.F 大根堆 / BZOJ 4919 大根堆(LIS,启发式合并)
    题意简述有一个以\(1\)为根的有根树,每个点有权值\(v_i\)。你需要选出一个点集\(S\),使得点集里任意两个元素\(x,y\),若\(x\)在原树上是\(y\)的祖先,则要满足\(v_x>v_y\)。求选出的点集的最大大小是多少。解法原题限制相当于:在选出的点集构成的新树\(T\)中,每个点到根节......
  • springboot+mybtais+mysql
    一、通过maven引入相应的包pom.xml<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http......