前言:

由于二叉树这一章的题型比较多,涉及到的递归程序也较多,所以单开一个随笔来记录这个学习过程,希望对读者有帮助。

理论知识基础

在二叉树的选择题中,常常会涉及到对于最多或最少结点、最大或最小高度、求叶子结点个数这几类经典的问题。

上机题

1.二叉树的建立和遍历

P1305 新二叉树

  • 这题考察输入每个结点和其左右子树,然后前序遍历

P4715 【深基16.例1】淘汰赛

  • 这题考察给你所有叶子结点,让你建立一颗满二叉树

L2-051 满树的遍历

  • dfs前序遍历树
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define endl '\n'
vector<int>ve[100005];
map<int,int>cnt; void dfs(int x)
{
if(ve[x].size()==0) return ;
for(auto t:ve[x])
{
cout<<" "<<t;
dfs(t); }
} void solve() { int n;
int maxx=-1;
cin >> n;
int root=0;
for (int i = 1; i <= n; i++)
{
int u; cin>>u;
cnt[u]++;
ve[u].push_back(i);
if(u==0) root=i; } maxx=cnt[root]; int flag=0;
for(int i=1;i<=n;i++) {
sort(ve[i].begin(),ve[i].end());
if(ve[i].size()!=0 ) if(ve[i].size()!=maxx) flag=1; }
cout<<maxx<<" ";
if(flag) cout<<"no";
else cout<<"yes";
cout<<endl; cout<<root;
dfs(root); } signed main() { int t = 1;
// cin>>t;
while (t--) solve(); return 0;
}

P4913 【深基16.例3】二叉树深度

  • 建立二叉树遍历求深度

L2-006 树的遍历

  • 通过中序和后序构建树,然后再层序输出
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define endl '\n'
int po[35];
int ino[35];
vector<int>ans[50]; int dfs(int l1, int r1, int l2, int r2) {
for (int i = l2; i <= r2; i++) {
if (ino[i] == po[r1]) {
int root = po[r1]; int lc = dfs(l1, l1 + i - l2 - 1, l2, i - 1) ; //递归左子树
int rc = dfs(l1 + i - l2, r1 - 1, i + 1, r2) ; //递归右子树
if (lc) ans[root].push_back(lc);
if (rc) ans[root].push_back(rc); return root;
}
}
return 0; } void solve() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) cin >> po[i];
for (int i = 1; i <= n; i++) cin >> ino[i];
dfs(1, n, 1, n); queue<int>q;
q.push(po[n]);
cout << po[n];
while (q.size()) {
int t = q.front();
q.pop();
for (auto i : ans[t]) {
q.push(i);
cout << " " << i;
} } } signed main() { int t = 1;
// cin>>t;
while (t--) solve(); return 0;
}

L2-038 病毒溯源

  • 最大深度,以及最小且最长的路径
#include <bits/stdc++.h>
using namespace std;
vector<int>bd[10005];
bool vis[10005];
int maxx = -1;
int root;
map<int, int>d; //用来找根节点,根节点入度为0
vector<int>road;
bool check; void dfslen(int x, int dep) { //递归找最大长度
if (bd[x].size() == 0) maxx = max(dep, maxx);
for (auto t : bd[x]) dfslen(t, dep + 1);
} bool dfs(int x,int dep)
{
if(dep==maxx)
{
return 1;
}
bool res=0;
for(auto t:bd[x])
{
if(dfs(t,dep+1)) {
if(t<road[x]) road[x]=t;
res=1;
} }
return res; } /*
void dfs(int x,int dep)
{
if(dep==maxx) {
check=1;
return ;
}
check=0;
for(auto t:bd[x])
{
dfs(t,dep+1);
if(check){
if(t<road[x]) road[x]=t;
}
} }*/ signed main() { int n;
cin >> n;
for (int i = 0; i < n; i++) {
int x;
cin >> x;
while (x--) {
int z;
cin >> z;
bd[i].push_back(z);
d[z]++;
}
} //寻找根节点
for (int i = 0; i < n; i++) {
if (d[i] == 0) {
root = i;
break;
}
} dfslen(root, 1); cout << maxx <<endl;
road.resize(n);
for(int i=0;i<n;i++) road[i]=1e9; dfs(root,1); int cur=root;
cout<<root;
while(road[cur]!=1e9)
{
cout<<" "<<road[cur];
cur=road[cur];
} }

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

  • 通过后序遍历序列 建立层次遍历序列
#include <bits/stdc++.h>
#define int long long
using namespace std;
#define endl '\n'
int tree[100005];
int a[100005];
int p = 1;
int n; void dfs(int x) {
if (x <= n) {
dfs(2 * x);
dfs(2 * x + 1);
tree[x] = a[p++];
}
} void solve() { cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
dfs(1); cout << tree[1];
for (int i = 2; i <= n; i++) {
cout << " " << tree[i];
} } signed main() { int t = 1;
// cin>>t;
while (t--) solve(); return 0;
}

2.前序、中序、后序遍历的转换

给出了中序以后,给定前序或后序都可以确定唯一的一棵树。

不给出中序则无法确定。

P1827 [USACO3.4] 美国血统 American Heritage

  • 这题给出前序和中序求后序

P1030 [NOIP2001 普及组] 求先序排列

  • 这题给出中序和后序求前序

二叉树专题学习(C++版) 基础的上机题的更多相关文章

  1. 2022GDUT寒假专题学习-1 B,F,I,J题

    专题链接:专题学习1 - Virtual Judge (vjudge.net) B - 全排列 题目 思想 这道题可以用DFS进行求解,但是一看到全排列,其实可以立刻想到一个STL函数:next_pe ...

  2. Emacs学习心得之 基础操作

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础操作 1.前言与学习计划2.Emacs基础操作 一. 前言与学习计 ...

  3. java与.net比较学习系列(2) 基础语言要素

    这一篇从最基础的开始对比总结,说起基础语言要素,故名思义,就是学习语言的基础,主要内容包括标识符,关键字和注释.我想从以下几点进行总结,有区别的地方有都使用红色粗体字进行了总结. 1,标识符 2,关键 ...

  4. 大数据学习之Linux基础01

    大数据学习之Linux基础 01:Linux简介 linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹 在1991年10月5日首次发布.,在加上用户空间的应用程序之后 ...

  5. [学习线路] 零基础学习hadoop到上手工作线路指导(初级篇)

    about云课程最新课程Cloudera课程   零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了. ...

  6. Virtex6 PCIe 超简版基础概念学习(二)

    Virtex6 PCIe 超简版基础概念学习(二) 分类:FPGAPCIe (2081)  (0)  举报  收藏 文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 ise14.7 ...

  7. Python学习day11-函数基础(1)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  8. 图灵学院JAVA互联网架构师专题学习笔记

    图灵学院JAVA互联网架构师专题学习笔记 下载链接:链接: https://pan.baidu.com/s/1xbxDzmnQudnYtMt5Ce1ONQ 密码: fbdj如果失效联系v:itit11 ...

  9. 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解

    什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ...

  10. linux发行版基础目录

    linux发行版基础目录 linux 基础目录 linux基础目录 目录 作用 / 根目录,起源 /boot linux引导启动目录 /lib 库目录 /bin 常用内部命令 /sbin 常用内部管理 ...

随机推荐

  1. 微服务实战系列(八)-网关springcloud gateway自定义规则-copy

    1. 场景描述 先说明下项目中使用的网关是:springcloud gateway, 因需要给各个网关服务系统提供自定义配置路由规则,实时生效,不用重启网关(重启风险大),目前已实现:动态加载自定义路 ...

  2. 更换Linux系统镜像源

    更换Linux系统镜像源 切换镜像源通常是为了提高软件包下载的速度和稳定性.以下是CentOS 7切换镜像源的一般步骤: 一.安装wget(如果尚未安装) 首先,需要确保系统中安装了wget工具,因为 ...

  3. TIPTOP应付账款流程学习

    应付账款流程与应收账款流程是财务管理的开端,也是财务工作的主要流程. 企业的应付账款有很多种,如原材料的应付账款.电力能源的应付账款.房租的应付账款等,大头是原材料的应付账款,以下详细说明. 在讲解之 ...

  4. Core WebAPI配置Swagger

    1.配置Swagger: Swagger是一套接口文档的规范,通过这套规范,你只需要按照它的规范去定义接口以及接口相关的信息.再通过Swagger衍生出来的一系列项目和工具,就可以做到生成各种格式的接 ...

  5. Arduino语法--运算符

    本节介绍最常用的一些Arduino运算符,包括赋值运算符.算数运算符.关系运算符.逻辑运算符和递增/减运算符. 一. 赋值运算符 =(等于)为指定某个变量的值,例如:A=x,将x变量的值放入A变量. ...

  6. Vue实现企业微信扫码登录

        Vue实现企业微信扫码登录   企业微信扫码登录原理 构建企业微信登录二维码 获取访问令牌access_token 请求方式:GET(HTTPS)请求URL:https://qyapi.wei ...

  7. Docker 安装详细步骤

    一.安装前的准备 确认系统要求 不同的操作系统对 Docker 的支持有所不同,常见的如 Windows.MacOS 和各种 Linux 发行版. 启用虚拟化(如果需要) 对于某些系统,可能需要在 B ...

  8. 计数类 dp 做题记录(长期更新)

    前言 因为本人太弱,急需锻炼思维,固从现在起开始着手写计数题,并写下题解分析思路的欠缺.另外本文将长时间更新,所以我准备把它置顶,尽量日更! upd on 24.11.6 现版本改成长期更新. P36 ...

  9. 基于Qt的在QGraphicsView中绘制带有可动拐点的连线的一种方法

        摘要:本文详细介绍了基于Qt框架在`QGraphicsView`中实现带有可动拐点连线的绘制方法.通过自定义`CustomItem`和`CustomPath`类,结合`QGraphicsIte ...

  10. python二级 计算生态

    生态地址: https://pypi.python.org/pypi 常用函数: