【PTA】二叉树题总结

2023-11-20

完全二叉搜索树(中序遍历+存位置)

一个无重复的非负整数序列,必定对应唯一的一棵形状为完全二叉树的二叉搜索树。本题就要求你输出这棵树的层序遍历序列。

输入格式:
首先第一行给出一个正整数 N(≤1000),随后第二行给出 N 个不重复的非负整数。数字间以空格分隔,所有数字不超过 2000。

输出格式:
在一行中输出这棵树的层序遍历序列。数字间以 1 个空格分隔,行首尾不得有多余空格。

输入样例:

10
1 2 3 4 5 6 7 8 9 0

输出样例:

6 3 8 1 5 7 9 0 2 4

代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define fi first
#define se second
#define pii pair<int,int>
#define pb push_back
const int N=1e3+10;
int n,a[N],ans[N];
int num=1;
void dfs(int u)
{
	if(u>n) return;
	dfs(u*2);
	ans[u]=num++;
	dfs(u*2+1);
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>a[i];
	sort(a+1,a+1+n);
	dfs(1);
	int f=0;
	fir(i,1,n)
	{
		if(f) cout<<" ";
		f++;cout<<a[ans[i]];
	}
	return 0;
}

L2-004 这是二叉搜索树吗?(二叉搜索树性质+递归)

L2-004 这是二叉搜索树吗?

此题我们知道了二叉搜索树的性质:左子树小于根,右子树大于等于根。
且输入的是前序遍历,则对一个二叉树[l,r]:a[l]是根,[l+1,r]是左右子树范围。
其中,前x项若都小于根,剩下的都大于等于根:则从l+1开始的前x个就是左子树,剩下的都是右子树。如此就分出了左右子树[l1,r1][l2,r2],然后再对左右子树递归即可。

由于输出要后序遍历,则我们只需:递归左子树,递归右子树,存根 (按照后序遍历的顺序)即可。

递归中注意一些范围。
镜像后的算法同理。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
const int N=1e3+10;
int n,a[N];
vector<int>ans;
int m;
void solve(int l,int r)//[l,r] 其中a[l]是根 
{
	if(r<l) return;
	int i=l+1,j=r;
	if(!m)
	{
		while(a[i]<a[l]&&i<=r) i++;
		while(a[j]>=a[l]&&j>l) j--;
		if(i-j!=1) return;
		solve(l+1,i-1);
		solve(j+1,r);
		ans.pb(a[l]);
	}
	else
	{
		while(a[i]>=a[l]&&i<=r) i++;
		while(a[j]<a[l]&&j>l) j--;
		if(i-j!=1) return;
		solve(l+1,i-1);
		solve(j+1,r);
		ans.pb(a[l]);
	}
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>a[i];
	m=0;//不镜像 
	solve(1,n);
	if(ans.size()==n)
	{
		puts("YES");int f=0;
		for(auto x:ans)
		{
			if(f) cout<<" ";
			cout<<x;f++;
		}
	}
	else
	{
		ans.clear();m=1;
		solve(1,n);
		if(ans.size()==n)
		{
			puts("YES");int f=0;
			for(auto x:ans)
			{
				if(f) cout<<" ";
				cout<<x;f++;
			}
		}
		else puts("NO");
	}
	
	return 0;
}

L2-006 树的遍历(用后序和中序得出根节点、分出左右子树+递归)

L2-006 树的遍历

这里要用map,因为不知道这是什么形状的二叉树,不知道某个点是否有值。
后序的最后一个是根,用根在中序中分出左右子树,再递归地执行同样步骤。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define mem(a,x) memset(a,x,sizeof(a))
const int N=30+10;
int n,hou[N],zhong[N];
map<int,int>mp;
void solve(int l,int r,int ll,int rr,int now)//后 中  
{
	//后序遍历则hou[r]是根 
	if(l<=r&&ll<=rr)
	{
		mp[now]=hou[r];
		int root=hou[r];
		for(int i=ll;i<=rr;i++)
		{
			if(zhong[i]==root)//找到根了 
			{
				solve(l,i-1-ll+l,ll,i-1,now*2);
				solve(r-rr+i,r-1,i+1,rr,now*2+1);
			}
		}
	}
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>hou[i];
	fir(i,1,n) cin>>zhong[i];
	solve(1,n,1,n,1);
	int f=0;
	for(auto x:mp)
	{
		if(f) cout<<" ";
		f++;
		cout<<x.second;
	}
	return 0;
}

L2-011 玩转二叉树(中序+前序+递归)

L2-011 玩转二叉树

注意:前序中左子树范围的顺序其实就是左子树中根的顺序,右子树亦然。所以这里递归不需要中序的[l,r],只需要知道根的位置。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define mem(a,x) memset(a,x,sizeof(a))
const int N=30+10;
int n,z[N],q[N];
map<int,int>mp;
//中
void solve(int l,int r,int root,int now)
{
	if(l<=r)
	{
		mp[now]=q[root];
		for(int i=l;i<=r;i++)
		{
			if(q[root]==z[i])
			{		
				solve(l,i-1,root+1,now*2+1);//左子树放到右边 
				solve(i+1,r,root+i+1-l,now*2);//右子树放到左边		
				return;
			}
		}
	}
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>z[i];
	fir(i,1,n) cin>>q[i];
	solve(1,n,1,1);
	int f=0;
	for(auto x:mp)
	{
		if(f) cout<<" ";
		f++;cout<<x.second;
	}
	return 0;
}

L2-035 完全二叉树的层序遍历(概念+递归)

L2-035 完全二叉树的层序遍历

根据完全二叉树和后序遍历概念递归。

#include<bits/stdc++.h>
using namespace std;
#define fir(i,a,n) for(int i=a;i<=n;i++)
#define mem(a,x) memset(a,x,sizeof(a));
#define pb push_back
typedef long long ll;
const int N=30+10;
int a[N],n;
map<int,int>mp;
int cnt;
void solve(int idx)
{
	if(idx>n) return;
	solve(idx*2);
	solve(idx*2+1);
	mp[idx]=a[cnt++];
}
int main()
{
	cin>>n;
	fir(i,1,n) cin>>a[i];
	cnt=1;
	solve(1);
	int f=0;
	for(auto x:mp)
	{
		if(f) cout<<" ";
		if(x.second) cout<<x.second;
		f++;
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【PTA】二叉树题总结 的相关文章

  • 双线性序列给出奇数结果

    我试图让我的表现技能 不存在 达到标准 但在将公式写入代码时遇到了问题 这是我试图将其引用为 转换 为代码的公式 考虑一个序列 u 其中 u 定义如下 号码u 0 1是第一个u 对于每个x in u then y 2 x 1 and z 3
  • 使用 C++ 拆分“[常规设置]”格式的节字符串

    我是 C 新手 我想读取包含部分和键值对的 ini 文件 根据部分 我想读取相应键的值 首先 我想阅读方括号内的部分 请帮忙 谢谢 对于真正的 INI 文件解析 我强烈建议iniparser库 http ndevilla free fr i
  • 使用 JSON 格式正确配置 NLog 到 IHostBuilder

    我有以下代码 应该接受 NLog 的 JSON appsettings 配置 然后使用它来创建 NLog LogFactory 这个 NLog 工厂应该被传递到 MyService 类中 以便在那里创建一个记录器 class Program
  • 每次调用新方法时触发事件

    我正在做一个logger for a c 应用程序需要记录每个方法被调用的时间以及每个方法执行时间 我可以通过调用自己的方法来做到这一点EventLogger LogMethodCall方法在每个方法的开头 但我想知道是否有办法使CLR每次
  • 宏可以按参数数量重载吗?

    如何this https stackoverflow com q 9183993 153285工作 如何实现 C99 C 11 可变参数宏以仅根据为其提供多少个参数来扩展到不同的事物 编辑 请参阅末尾以获得现成的解决方案 要获得重载的宏 首
  • 如何使用boost库读取和写入.ini文件[重复]

    这个问题在这里已经有答案了 如何使用boost库读取和写入 或修改 ini文件 With Boost PropertyTree您可以读取并更新树 然后写入文件 请参阅load and save功能 看一下如何访问属性树中的数据 http w
  • 在 C++ 中使用表达式模板进行符号微分

    如何在 C 中使用表达式模板实现符号微分 一般来说 您需要一种表示符号的方法 即编码的表达式模板 例如3 x x 42 以及一个可以计算导数的元函数 希望您对 C 中的元编程足够熟悉 知道这意味着什么和需要什么 但可以给您一个想法 This
  • C++:初始化静态字符串成员

    我在 C 中初始化静态字符串成员时遇到一些问题 我有几个类 每个类都包含几个表示 id 的静态字符串成员 当我通过调用静态函数初始化变量时 一切都很好 但是 当我想为一个变量分配另一个变量的值时 它仍然保留空字符串 这段代码有什么问题 st
  • 命名空间“Microsoft”中不存在类型或命名空间名称“Practices”

    我正在使用 Microsoft Visual Studio 2005 for c 我的代码中有以下命名空间 using Microsoft Practices EnterpriseLibrary using Microsoft Practi
  • C for 循环索引:新 CPU 中的前向索引更快吗?

    在我订阅的邮件列表上 两位知识渊博的 IMO 程序员正在讨论一些优化的代码 并说了以下内容 在 5 8 年前发布的 CPU 上 向后迭代 for 循环稍微快一些 e g for int i x 1 i gt 0 i 因为比较i归零比将其与其
  • 捕获另一个进程未处理的异常

    我想知道我是否可以捕获我开始使用 Process Start 的另一个进程抛出的未处理的异常 我知道我可以用这个捕获标准错误link http social msdn microsoft com Forums en US csharpgen
  • 使用 QGraphicsScene 实现流畅的动画

    我希望我的问题并不总是同样的问题 我有一个 QGraphicsScene 它的项目是一些 QGraphicsPixmap 我用一个计时器来移动它们 每秒 SetX 10 我设置 10是因为窗口大100 使用这个解决方案我的动画不流畅 我想我
  • 带有自定义鉴别器的 EntityFramework Code First 继承

    我正在尝试在 EntityFramework Code First 中映射以下继承 public class Member public string ProjectName get set public string AssemblyNa
  • SQL参数化查询不显示结果

    我的 DataAcess 类中有以下函数 但它没有显示任何结果 我的代码如下 public List
  • 该组件没有由 uri 标识的资源

    我想创建一个通用数据网格以在我的所有视图 用户控件上使用 这是我的结构 Class Library called Core Class called ViewBase public class ViewBase UserControl pu
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 如何使用 xamarin 表单提示用户进行地理定位

    我正在 Xamarin Forms 应用程序中开发一个应用程序 需要请求地理位置权限 如果获得许可 它需要从设备获取地理位置数据 然后将地理位置坐标放入 Forecast io URL 我正在使用 James 的 Geolocator 插件
  • 未找到 _sqlite3_open 等符号错误

    您好 我收到此错误 Undefined symbols sqlite3 open referenced from main in ccRlWVer o sqliite3 close referenced from main in ccRlW
  • 在 C# WinForms 中预览文档(Word、Excel、PDF、文本文件等)?

    我正在开发一个 C WinForms 应用程序 我希望能够 预览 其中的各种文档类型 也就是说 当用户从列表中选择文件名时 它会在下面以相同的形式显示所选文件的预览 这很像 Outlook 允许您无需双击即可预览选定邮件的方式 有没有什么方
  • 从 STL 列表中删除项目

    我想创建一个函数 如果符合特定条件 则将项目从一个 STL 列表移动到另一个列表 这段代码不是这样做的方法 迭代器很可能会被擦除 函数失效并导致问题 for std list

随机推荐

  • 权重实现随机抽奖

    一般抽奖是怎么实现的 在实习期间学会了一种通用的写法 在这里记录一下 最近在学Golang语法基础 这里就用Golang来写 package main import fmt time math rand func main r rand N
  • 模态对话框与非模态对话的几种销毁方法与区别

    前几天发现自己的程序中使用非模态对话框 Debug版本有警告提示如下 Warning calling DestroyWindow in CWnd CWnd OnDestroy or PostNcDestroy in derived clas
  • 关于高并发与多线程中的线程池

    关于高并发与多线程中的线程池 定义 线程是稀缺资源 它的创建与销毁是一个相对偏重且耗资源的操作 而Java线程依赖于内核线程 创建线程需要进行操作系统状态切换 为避免资源过度消耗需要设法重用线程执行多个任务 线程池就是一个线程缓存 负责对线
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • libuv 原理_[Nodejs原理] 核心库Libuv入门(Hello World篇)

    Libuv是什么 1 简介Libuv是一个高性能的 事件驱动的异步I O库 它本身是由C语言编写的 具有很高的可移植性 libuv封装了不同平台底层对于异步IO模型的实现 所以它还本身具备着Windows Linux都可使用的跨平台能力 L
  • 数据密集型应用系统设计(2)

    文章目录 数据模型与查询语言 NoSQL 数据库历史 关系数据库与文档数据库现状 数据查询语言 图状数据模型 小结 数据模型与查询语言 大多数应用程序是通过一层层叠加数据模型来构建的 例如 应用程序开发人员观测现实世界 通过对象或者数据结构
  • Vue 和 jQuery 两者之间的区别是什么?

    1 jQuery 介绍 jQuery 曾经也是现在依然最流行的 web 前端 js 库 可是现在无论是国内还是国外他的使 用率正在渐渐被其他的 js 库所代替 随着浏览器厂商对 HTML5 规范统一遵循以及 ECMA6 在浏 览器端的实现
  • NGINX配置PHP网站

    NGINX配置PHP网站 NGINX配置PHP网站 源码安装NGINX 安装PHP 修改PHP参数 重启PHP 修改nginx配置文件 重启NGINX 测试 解决报错问题 NGINX配置PHP网站 源码安装NGINX 脚本一键安装 安装路径
  • springboot 整合EHcache 实现分页缓存

    一 简要概述 Cacheable 对当前的对象做缓存处理 Cacheable 作用 把方法的返回值添加到 Ehcache 中做缓存 Cacheable value xxx key xxxx Value 属性 指定一个 Ehcache 配置文
  • 小米造车?年轻人的第一辆电动车?

    素来有着价格屠夫称号的 小米 终于要对电动车出手了 事件简讯 昨天下午 据 晚点LatePost 爆料 小米 已确定造车 并视其为战略级决策 不过具体形式和路径还未确定 或许仍有变数 一位知情人士称 小米造车或将由小米集团创始人雷军亲自带队
  • 软件质量保障之代码走查

    目的 代码走查有几个目的 第一个是让新同学快速熟悉代码并了解系统 第二个是做咨询防控的事前检查 避免引发线上故障 第三个是通过一起讨论和审查 加强团队代码阅读和编写能力 让大家编写出优秀的代码 代码走查的优点非常多 但是最核心的还是提前发现
  • 模2除法——用非常直观的例子解释

    前言 差错检测中有名唤CRC之方法 但很多学习者难以理解其运行原理 特别是模2除法 故博主将其原理以示例方式记录下来 以便同道稍作借鉴 因博主水平有限 难免会出现错误 希各位能多多包涵和给予建议 注意 本博客假设各位已理解CRC原理但对模2
  • javascript几个知识点

    本文总结一下javascript几个比较重要的知识点 包括scope chain this 和函数的一些高级特性 scope chain scope chain是javascript函数调用里最核心的概念 尤其是要理解闭包的概念的话 必须先
  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • 时序预测

    时序预测 MATLAB实现趋势外推时间序列预测 含移动平均 指数平滑对比 目录 时序预测 MATLAB实现趋势外推时间序列预测 含移动平均 指数平滑对比 基本介绍 程序设计 学习总结 参考资料 基本介绍 MATLAB实现趋势外推时间序列预测
  • 《银行法律法规》一、经济金融基础知识——4、银行体系

    第四章 银行体系 第一节 银行起源和发展 考点1 商业银行产生与发展 概念 商业银行指能够吸收公众存款 发放贷款 办理结算等多种业务 以盈利为主要经营目标 经营货币的金融企业 在银行体系中占有重要地位 信用活动中起着主导作用 产生途径 现代
  • mount通过NFS挂载

    文章目录 mount通过NFS挂载 1 NFS介绍 2 安装 1 ubuntu服务器安装命令 2 客户端linux5 4安装指令 3 建立NFS共享文件目录 4 配置NFS共享配置文件 1 第一段的目录需要替换成自己的共享文件目录 2 第二
  • C++ 高性能Http服务器 - HelloWorld(一)

    本文使用 newobj 跨平台开发框架实现 Web 服务的搭建及业务处理 最终实现个人博客网站的Demo 其中使用Mysql Redis数据库 该框架实测可处理 6w 并发的请求并进行数据库处理 非常适合工作或学习中需要了解或应用C 开发w
  • SO_RCVTIMEO ,  MSG_WAITALL

    test SO RCVTIMEO and MSG WAITALL 1 首先两者都运用于阻塞的情景下 对nonblock的fd不起作用 2 SO RCVTIMEO socket选项 作为getsockopt setsockopt的参数 见下
  • 【PTA】二叉树题总结

    完全二叉搜索树 中序遍历 存位置 一个无重复的非负整数序列 必定对应唯一的一棵形状为完全二叉树的二叉搜索树 本题就要求你输出这棵树的层序遍历序列 输入格式 首先第一行给出一个正整数 N 1000 随后第二行给出 N 个不重复的非负整数 数字