二叉树专题学习(C++版) 基础的上机题
前言:
由于二叉树这一章的题型比较多,涉及到的递归程序也较多,所以单开一个随笔来记录这个学习过程,希望对读者有帮助。
理论知识基础
在二叉树的选择题中,常常会涉及到对于最多或最少结点、最大或最小高度、求叶子结点个数这几类经典的问题。
上机题
1.二叉树的建立和遍历
- 这题考察输入每个结点和其左右子树,然后前序遍历。
- 这题考察给你所有叶子结点,让你建立一颗满二叉树。
- 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;
}
- 建立二叉树遍历求深度
- 通过中序和后序构建树,然后再层序输出
#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;
}
- 找最大深度,以及最小且最长的路径
#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];
	}
}
- 通过后序遍历序列 建立层次遍历序列
#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
- 这题给出前序和中序求后序
- 这题给出中序和后序求前序
二叉树专题学习(C++版) 基础的上机题的更多相关文章
- 2022GDUT寒假专题学习-1  B,F,I,J题
		专题链接:专题学习1 - Virtual Judge (vjudge.net) B - 全排列 题目 思想 这道题可以用DFS进行求解,但是一看到全排列,其实可以立刻想到一个STL函数:next_pe ... 
- Emacs学习心得之 基础操作
		作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础操作 1.前言与学习计划2.Emacs基础操作 一. 前言与学习计 ... 
- java与.net比较学习系列(2) 基础语言要素
		这一篇从最基础的开始对比总结,说起基础语言要素,故名思义,就是学习语言的基础,主要内容包括标识符,关键字和注释.我想从以下几点进行总结,有区别的地方有都使用红色粗体字进行了总结. 1,标识符 2,关键 ... 
- 大数据学习之Linux基础01
		大数据学习之Linux基础 01:Linux简介 linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹 在1991年10月5日首次发布.,在加上用户空间的应用程序之后 ... 
- [学习线路] 零基础学习hadoop到上手工作线路指导(初级篇)
		about云课程最新课程Cloudera课程 零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了. ... 
- Virtex6 PCIe 超简版基础概念学习(二)
		Virtex6 PCIe 超简版基础概念学习(二) 分类:FPGAPCIe (2081) (0) 举报 收藏 文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 ise14.7 ... 
- Python学习day11-函数基础(1)
		figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ... 
- 图灵学院JAVA互联网架构师专题学习笔记
		图灵学院JAVA互联网架构师专题学习笔记 下载链接:链接: https://pan.baidu.com/s/1xbxDzmnQudnYtMt5Ce1ONQ 密码: fbdj如果失效联系v:itit11 ... 
- 线段树学习笔记(基础&进阶)(一) | P3372 【模板】线段树 1 题解
		什么是线段树 线段树是一棵二叉树,每个结点存储需维护的信息,一般用于处理区间最值.区间和等问题. 线段树的用处 对编号连续的一些点进行修改或者统计操作,修改和统计的复杂度都是 O(log n). 基础 ... 
- linux发行版基础目录
		linux发行版基础目录 linux 基础目录 linux基础目录 目录 作用 / 根目录,起源 /boot linux引导启动目录 /lib 库目录 /bin 常用内部命令 /sbin 常用内部管理 ... 
随机推荐
- biancheng-Python机器学习算法
			http://c.biancheng.net/ml_alg/ Python机器学习 就当下而言,Python 无疑是机器学习领域最火的编程语言,这得益于 Python 对科学计算的强大支持.因此,本套 ... 
- w3cschool-Hibernate 教程
			什么是 ORM? ORM 表示 Object-Relational Mapping (ORM),是一个方便在关系数据库和类似于 Java, C# 等面向对象的编程语言中转换数据的技术.一个 ORM 系 ... 
- Drawable图形定制
			设置背景设置背景 button或者textview我们想要自定义他的背景就需要用到Drawable中创建xml文件 例如 shape标签是用来控制背景的形状的 他下面的子标签有 stroke控制描边 ... 
- Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环,SVC系统调用拦截。
			Android平台从上到下,无需ROOT/解锁/刷机,应用级拦截框架的最后一环 -- SVC系统调用拦截. ☞ Github: https://www.github.com/iofomo/abyss ... 
- react报错Can't resolve 'react' in 'E:\reactweb\preact\my-app\node_modules\react-dom\cjs'
			执行如下: npm install -g react npm install react --save 类似这种依赖项(react,react-dom 等)报错,哪个报错执行哪个即可 执行上述两句就 ... 
- mac spark+hive+hadoop 数据分析环境搭建(单机简版)
			apache产品下载地址: http://archive.apache.org/dist/ mysql5.6 brew方式安装配置: Icon mysql做为元数据存储使用. brew searc ... 
- 面试官:谈谈RabbitMQ的队头阻塞问题?
			RabbitMQ 延迟消息的队头阻塞问题是指,在使用死信队列(DLX)和 TTL(消息过期时间)实现延迟消息时,由于队列的先进先出(FIFO)特性,在队列头部消息未过期的情况下,即使后续消息已经过期也 ... 
- Linux嵌入式设备怎么确定网络端口的速率
			Linux嵌入式设备怎么确定网络端口的速率 突发奇想,就是Linux下面我能不能查询到端口的速率,以此来判断要不要频繁的发送网络数据包呢? 或者更换包利用率更高的协议呢. 于是抱着这样的想法,我开始学 ... 
- 读论文-序列感知推荐系统(Sequence-Aware Recommender Systems)
			前言 今天读的论文为一篇于2018年发表在(ACM computing surveys (CSUR))的论文,这篇文章主要讲述了序列感知推荐系统(Sequence-Aware Recommender ... 
- Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
			#div_digg { float: right; font-size: 12px; margin: 10px; text-align: center; width: 120px; position: ... 
