二叉树基本概念与遍历

什么是二叉树

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

在这里插入图片描述

二叉树的种类

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

满二叉树

在这里插入图片描述
我们可以通过他的名字就可以知道---------它的每个节点都有两个子节点(除了最后一层),而且每一层节点数都是满的。
我们可以观察一下每层节点的个数,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层。 法律层面具体对应的法律、法规一般性法律规定宪法、国家安全法、国家秘密法、治安管理处理条例等虽然没有专门针对信息安全的条款,但约束了信息安全相关的行为规范和惩罚信息网络犯罪的法律《中华人名共和国刑法》《…

17.2 SpringMVC框架_Restful开发风格

Restful开发风格 1. Restful风格介绍1.1 传统Web应用1.2 REST与RESTful1.3 RESTful数据传输1.4 RESTful开发规范1.5 RESTful命名要求(❤❤)2. RESTful开发实战2.1 maven项目添加web应用2.2 依赖2.3 请求响应2.4 @RestController注解2.5 @PathVariable注解2.6 简单请求与非简单请…

如何交接一个前端项目

一.在非交接状态下&#xff0c;需要做好的事情 必要的代码注释必要的文档梳理 readme即可&#xff0c;记录重要的信息方便自己查阅、方便新的伙伴快速了解项目 二.交接readme 2.1项目相关的网址 项目git地址不同环境的访问权限&#xff08;或者对应的测试账号/密码&#xf…

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 潜变量时空碎片, 建构视觉语言系统…

Linux----防火墙之保存规则

一、关于iptables规则的保存 之前写的iptables的设置&#xff0c;但是都是临时生效的&#xff0c;一旦电脑重启&#xff0c;那么就会失效&#xff0c;如何永久保存&#xff0c;需要借助iptables-save命令&#xff0c;开机生效需要借助iptables-restore命令&#xff0c;并写入规…

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

引言&#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; 大家…

Linux文件系统笔记

文章目录 FILE SYSTEM软硬链接 动静态库 使用别人提供的库 FILE SYSTEM 文件的管理工作&#xff1a; 1.基础知识&#xff1a; 文件 属性 内容不是所有文件都会打开所有的打开的&#xff0c;未打开的文件会进行管理未打开文件&#xff0c;要能做到快速定位文件磁盘–物理存…

C++:const关键字

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

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

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

python语言常见面试题:如何在Python中实现线程安全?

在Python中实现线程安全通常涉及到使用锁&#xff08;Lock&#xff09;和同步原语&#xff08;Synchronization primitives&#xff09;来确保多个线程在访问共享资源时不会发生冲突。Python的标准库threading提供了多种锁和同步机制&#xff0c;如Lock、RLock、Condition、Sem…

Message Pack 协议详解及应用

文章目录 一、Message Pack是什么二、Message Pack的语法规则三、Message Pack相关链接四、Message Pack应用场景五、MessagePack 兼容性与特点 一、Message Pack是什么 Message Pack是一种高效的二进制序列化格式&#xff0c;用于在不同的应用程序之间进行数据交换。它类似于J…