二叉树基本概念与遍历

什么是二叉树

二叉树不同于别的树,因为他每个节点最多只有两个子节点,而别的树可以有无数个子节点。
所以二叉树就是只最多只有两个子节点的树,一个子节点叫右子节点,另一个子节点叫左子结点
而他们的上一层就是父子节点,最上层叫根节点

在这里插入图片描述

二叉树的种类

二叉树分三个种类普通二叉树,满二叉树,完全二叉树
普通二叉树不用说,先说说满二叉树

满二叉树

在这里插入图片描述
我们可以通过他的名字就可以知道---------它的每个节点都有两个子节点(除了最后一层),而且每一层节点数都是满的。
我们可以观察一下每层节点的个数,1,2,4,8…,观察下,这不就是等差数列嘛,,但是用等差数列不能够发现特点,所以我们可以将它换个形态:2^0, 2^1, 2^2, 2^3…
所以满二叉树每个层的节点数是2^(k-1)个(k是层数),再根据这个特点我们同样也可以结合等差数列推出每个满二叉树的总结的数: 2^k-1(k总层数)

完全二叉树

在这里插入图片描述

完全二叉树的概念是每层从左到右不断的叫完全二叉树(看不懂可以看图)比如图上就是个典范的完全二叉树,但下图就不是完全二叉树
在这里插入图片描述

为什么他不是呢因为6号位的左子节点没有,但有右子节点,而右子节点没有和5号位的右子节点连通
所以不构成完全二叉树
完全二叉树的特点:其实满二叉树属于特殊的完全二叉树,所以完全二叉树的每一层(除了最后一层)的节点数也是2^(k-1)(k层数),而完全二叉树的总结点数是前(k-1)层的总节点数+最后一层的节点数。

二叉树c++代码

了解完二叉树就可以代码了
二叉树的初始化
二叉树的初始化有两种
第一种struct

typedef struct node
{char date; //父子节点struct node *left;//左子结点struct node *right;	//右子节点
}BiTNode; BiTNode *creatBiTree()
{char k;cin>>k;if(k=='#')return NULL;BiTNode *T=(BiTNode *)malloc(sizeof(BiTNode));T->data=k;   //父子节点//递归T->left=creatBiTree();//左子结点T->right=creatBiTree();//右子节点return T;
}

第二种数组(个人比较喜欢数组)

int ab[105][2];
for(循环){
ab[i][0]=b;    //左子结点
ab[i][1]=c;   //右子节点
}

二叉树的遍历

二叉树的遍历主要是递归

先序遍历

父子节点->左子结点->右子节点

void dfs1(int x){if(x==0){return ;}cout<<x<<" ";dfs1(ab[x][0]);dfs1(ab[x][1]);
}

中序遍历

左子结点->父子节点->右子节点


void dfs2(int x){if(x==0){return ;}dfs2(ab[x][0]);cout<<x<<" ";dfs2(ab[x][1]);
}

后序遍历

左子结点->右子节点->父子节点


void dfs3(int x){if(x==0){return ;}dfs3(ab[x][0]);dfs3(ab[x][1]);cout<<x<<" ";
}

最后是一道题目

二叉树遍历加强版

时间限制:1 s内存限制:128 MB
二叉树的每个结点包含一个大写字母,且两两不同。

给出二叉树的前序遍历和中序遍历,求后序遍历。

输入
第一行给出一个字符串表示前序遍历。

第二行给出一个字符串表示中序遍历。

遍历结果只由大写字母组成,非空,且长度不超过26。

输出
输出后序遍历的结果。
样例
输入 1
DBACEGF
ABCDEFG
输出 1
ACBFGED
输入 2
BCAD
CBAD
输出 2
CDAB
【分析】其实这道题的思路很简单就是先构造树再后序遍历,当然有思路可是怎么构造二叉树是个问题,不过不如我们先观察

在这里插入图片描述
观察后我们可以发现中序遍历中根节点的左边是整个左子树,右边是整个右子树
这就很简单了,每次递归左子树和右子树就可以构造出整个树,随后再回溯,获取每棵子树的根节点
代码如下

#include<bits/stdc++.h>
using namespace std;
string a,b;
vector<char>ans;
void dfs(int l1,int r1,int l2,int r2){if(l1>r1||l2>r2){return ;}int p=-1;for(int i=l2;i<=r2;i++){if(b[i]==a[l1]){p=i;break;}}int len=p-l2;dfs(l1+1,l1+len,l2,l2+len-1);//访问左子树dfs(l1+len+1,r1,p+1,r2);//访问右子树ans.push_back(a[l1]);
}
int main()
{
cin>>a>>b;
int n=a.size();
dfs(0,n-1,0,n-1);
for(int i=0;i<n;i++) cout<<ans[i];return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/691866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

航班进出港|航班进出港管理系统|基于springboot航班进出港管理系统设计与实现(源码+数据库+文档)

航班进出港管理系统目录 目录 基于springboot航班进出港管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 5、航班信息管理 &#xff08;1&#xff09; 航班信息管理 &#xff08;2&#xff09;起飞降落申请管理 &#xff08;3&#xff09;公告管理 &…

城市智慧驿站是什么?城市智慧驿站有哪些功能

城市智慧驿站作为一种创新性的社会配套设施&#xff0c;开始在多个城市落地使用&#xff0c;引起了社会的关注。 城市智慧驿站是什么&#xff1f;城市智慧驿站是在智慧城市的背景下&#xff0c;城市智慧驿站智慧公厕成为了一种创新性的社会配套建筑。作为景观式模块化建筑&…

UE蓝图 分支(Branch)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 文章目录 系列文章目录一、分支节点功能二、分支节点用法三、分支节点使用场景四、分支节点实现过程五、分支节点相关源码 一、分支节点功能 在Unreal Engine&a…

Mysql数据库主从集群从库Slave因为RelayLog过多过大引起服务器硬盘爆满生产事故实战解决

Mysql数据库主从集群从库slave因为RelayLog过多过大引起从库服务器硬盘爆满生产事故实战解决 一、MySQL数据库主从集群概念 MySQL数据库主从集群是一种高可用性和读写分离的数据库架构&#xff0c;它基于MySQL的复制&#xff08;Replication&#xff09;技术来同步数据。在主…

【Kotlin】Kotlin流程控制

1 选择结构 Kotlin 中选择结构主要包含 if -else、when 语句&#xff0c;并且可以返回结果。 1.1 if-else 1.1. 条件选择 fun main() {var score 85if (score > 90) {println("优秀")} else if (score > 80) {println("良好")} else if (score &…

信息安全法律法规体系

信息安全法律法规体系 我国信息安全法规体系可以分为4层。 法律层面具体对应的法律、法规一般性法律规定宪法、国家安全法、国家秘密法、治安管理处理条例等虽然没有专门针对信息安全的条款,但约束了信息安全相关的行为规范和惩罚信息网络犯罪的法律《中华人名共和国刑法》《…

MySQL篇之主从同步原理

一、原理 MySQL主从复制的核心就是二进制日志。 二进制日志&#xff08;BINLOG&#xff09;记录了所有的 DDL&#xff08;数据定义语言&#xff09;语句和 DML&#xff08;数据操纵语言&#xff09;语句&#xff0c;但不包括数据查询&#xff08;SELECT、SHOW&#xff09;语句。…

19-树-填充每个节点的下一个右侧节点指针 II

这是树的第19篇算法&#xff0c;力扣链接。 给定一个二叉树&#xff1a; struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针&#xff0c;让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点&#xff0c;则将 next 指针设置为 NULL 。…

继ChatGPT后的又一王炸!Sora模型解析与体验通道

前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff1a;https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言OpenAI体验通道Spacetime Latent Patches 潜变量时空碎片, 建构视觉语言系统…

“薪”的一年程序员裁员潮技术变革情况下 程序员就业机会在哪里?

引言&#xff1a;一对来自中国的工程师夫妻在美国的不幸身亡&#xff0c;疑似与谷歌的裁员有关&#xff0c;这一事件再次引发了人们对技术变革下裁员对程序员影响的关注。 一、针对裁员潮的一些看法 在我看来&#xff0c;技术变革对程序员的影响是双面的。一方面&#xff0c;…

代码随想录算法训练营day16

题目&#xff1a;104.二叉树的最大深度、111.二叉树的最小深度、222.完全二叉树的节点个数 参考链接&#xff1a;代码随想录 104.二叉树的最大深度 思路&#xff1a;上次是用层序遍历的思路做过。这次想一点不一样的思路&#xff0c;对于一个二叉树的最大深度其实即为其两个…

【Python机器学习】详解Python机器学习进行时间序列预测

&#x1f517; 运行环境&#xff1a;Python &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 &#x1f510;#### 防伪水印——左手の明天 ####&#x1f510; &#x1f497; 大家…

C++:const关键字

一、const成员变量(常成员变量) 1、只能使用初始化列表对常成员变量进行初始化&#xff1b; 2、常成员变量可以被访问&#xff0c;但是不能被修改&#xff1b; 3、类中所有构造函数都必须在初始化列表对常成员函数进行初始化(包括拷贝构造&#xff0c;移动构造)。 声明&am…

加固平板电脑在无人机的应用|亿道三防onerugged

无人机技术的快速发展已经在许多领域展现出巨大潜力&#xff0c;而加固平板电脑的应用在无人机领域中扮演着重要角色。 首先&#xff0c;加固平板电脑在无人机探测设备中发挥着关键作用。无人机探测设备通常需要实时传输高清图像和数据&#xff0c;以支持各种监测、勘测和检测…

蓝桥杯DP算法——背包问题(C++)

目录 一、01背包问题 二、完全背包问题 三、多重背包问题 四、多重背包问题&#xff08;优化版&#xff09; 五、分组背包问题 一、01背包问题 01背包问题就是有N件物品&#xff0c;一个空间大小为V的背包&#xff0c;每个物品只能使用一次&#xff0c;使得背包中所装物品…

职场数据分析必备|数据库入门之可视化工具Navicat

1、下载 Navicat &#xff08;1&#xff09;官网下载&#xff1a;https://navicatformysql.en.softonic.com/download 下载图示&#xff1a; 数据库入门&#xff08;二&#xff09;可视化工具Navicat​mp.weixin.qq.com/s?__bizMzU3Mzk0OTIzNA&mid100001258&idx1&…

el-table实现嵌套表格的展示

需求 一个表单中存在子表 列表返回格式 实现 实现思路 el-table中在嵌套一个el-table&#xff0c;这样数据格式就没问题了&#xff0c;主要就是样式 将共同的列放到一列中&#xff0c;通过渲染自定义表头render-header&#xff0c;将表头按照合适的宽度渲染出来 <el-…

品牌如何做好话题营销?这三点很关键

从“野性消费”到“疯四文学”&#xff0c;这些品牌让人记住的并不是某个内容&#xff0c;而是一个社交谈资&#xff0c;这些都算是成功的品牌话题&#xff0c;品牌话题的优势在于激活品牌&#xff0c;始终保持品牌活力&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;品牌…

免费3D模型网站大盘点,你推荐哪一个?

越来越多的设计师开始使用3D模型来提高效率、降低成本、提升效果和用户体验等。然而&#xff0c;寻找高质量的免费3D模型网站并不是一件容易的事情。今天&#xff0c;我们就来为大家介绍一些优秀的免费3D模型网站。 一、建e网 建e网是一个专业的室内设计资源平台&#xff0c;为…

Java的Lock(二)

自旋锁 VS 适应性自旋锁 堵塞或者notify一个Java线程需要操作系统切换CPU状态来完成(详情请参考11408)。这种状态切换需要耗费CPU时间。如果同步代码块种的内容过于简单。状态切换消耗的时间可能比用户代码执行的时间还要长。 在许多场景中,同步资源的锁定时间很短,为了这一…