【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】二叉树题总结 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 是否有与 C++11 emplace/emplace_back 函数类似的 C# 函数?

    从 C 11 开始 可以写类似的东西 include
  • C# 创建数组的数组

    我正在尝试创建一个将使用重复数据的数组数组 如下所示 int list1 new int 4 1 2 3 4 int list2 new int 4 5 6 7 8 int list3 new int 4 1 3 2 1 int list4
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 以编程方式使用自定义元素创建网格

    我正在尝试以编程方式创建一个网格 并将自定义控件作为子项附加到网格中 作为 2x2 矩阵中的第 0 行第 0 列 为了让事情变得更棘手 我使用了 MVVM 设计模式 下面是一些代码可以帮助大家理解这个想法 应用程序 xaml cs base
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12

随机推荐

  • 权重实现随机抽奖

    一般抽奖是怎么实现的 在实习期间学会了一种通用的写法 在这里记录一下 最近在学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 个不重复的非负整数 数字