数据结构基础--------【二叉树基础】

news2024/11/28 12:32:41

二叉树基础

二叉树是一种常见的数据结构,由节点组成,每个节点最多有两个子节点,左子节点和右子节点。二叉树可以用来表示许多实际问题,如计算机程序中的表达式、组织结构等。以下是一些二叉树的概念:

  1. 二叉树的深度:从根节点到叶子节点的最长路径的长度称为二叉树的深度,也称为高度。
  2. 二叉树的度:一个节点拥有的子节点数量称为该节点的度。二叉树的度为2,即每个节点最多只有两个子节点。
  3. 二叉树的遍历:二叉树的遍历是指按照一定顺序访问树中的所有节点。常用的遍历方式有前序遍历、中序遍历和后序遍历。
  4. 二叉查找树:二叉查找树是一种特殊的二叉树,它的左子树中所有节点的值都小于根节点的值,而右子树中所有节点的值都大于根节点的值。

二叉树的定义:

	struct TreeNode{
		int val;
		TreeNode* left;
		TreeNode* right;
		TreeNode(int x):val(x),left(nullptr),right(nullptr) {}
	}
  1. 二叉树的基本操作:包括二叉树的创建、遍历、搜索等。
  2. 二叉查找树的实现及应用:包括二叉查找树的创建、插入、删除、查找等操作。
  3. 平衡二叉树:为了解决二叉查找树在某些情况下退化为链表的问题,出现了平衡二叉树,如 AVL 树和红黑树等。
  4. 线段树:线段树是一种特殊的二叉树,用于解决区间查询的问题,如区间最大值、区间和等。
  5. 树状数组:树状数组也是一种特殊的二叉树,用于解决前缀和、区间和等问题。

1基础介绍

1.基础术语

结点的度:结点的字数个数,比如二叉树的度为2(一个节点最多有2个字数个数)。
树的度:数的所有结点中最大的度数。
叶结点:度为0的结点。
父结点,子结点,兄弟结点(具有同一个父结点的各结点)。
路径和路径的长度:从结点n1到nk,路径所包含的边的个数为路径的长度。
祖先结点,子孙结点。
结点的层次:规定根结点在1层,然后后面的结点层次都依次加一。
树的深度:树中国所有结点的最大层次是这棵树的深度。
二叉树T:一个有穷的结点集合,二叉树的子树有左右顺序之分

2.二叉树的定义

二叉树T:一个有穷的结点集合,二叉树的子树有左右顺序之分
特殊的二叉树:斜二叉树,满二叉树,完全二叉树(连续结点)

3.二叉树的性质

①个二叉树第i层的最大结点数为: 2^(i-1),(i≥1)
②深度为k的二叉树有最大结点总数为:(2^k)-1, k≥1。(1+2 ^1+2 ^2 …2 ^i )
③0对任何非空二叉树T,若n0表示叶结点的个数、n2是度为2的非叶结点个数,那么两者满足关系n0=n2 +1。
(n0+n1+n2-1) = 0n0+n1+2n2

4.二叉树的遍历

根据遍历结点的顺序,分为前序遍历(NLR),中序遍历(LNR),后续遍历(LRN)。树的遍历复杂度为o(n)。
所以看树的前序数组第一个是根结点,后续遍历数组最后一个是根结点,再把该根结点拿到中序遍历数组中去比对就可以划分左右子树。

4.1 前序遍历

如果二叉树为空,什么都不做,否则:
1)访问根节点;
2)先序遍历左子树
3)先序遍历右子树*/
void PreOrder(BiTree T){
    if(T!= null){
        vist(T);//访问根结点N
        PreOrder(T->lchild);//访问左子树L 递归
        PreOrder(T->rchild);//访问右子树R
    }
}

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9bb1889a4e194ea79a4cddeafc8109fc.png = 200x200)

4.2 中序遍历

/*inorder:
如果二叉树为空,什么都不做,否则:
1)中遍历左子树
2)访问根节点;
3)中序遍历右子树*/
void InOrder(BiTree T){
    if(T!= null){
        InOrder(T->lchild);//访问左子树L 递归
        vist(T);//访问根结点N
        InOrder(T->rchild);//访问右子树R
    }
}

在这里插入图片描述
4.3 后序遍历

/*Postorder:
如果二叉树为空,什么都不做,否则:
1)后序遍历左子树
2)后序遍历右子树
3)访问根节点;*/

void PostOrder(BiTree T){
    if(T!= null){
        PostOrder(T->lchild);//访问左子树L 递归
        PostOrder(T->rchild);//访问右子树R
        vist(T);//访问根结点N
    }
}

在这里插入图片描述

4.4层序遍历

2.遍历基础

1.DFS(Depth First Search):递归法得到最终的数组(深度优先算法)

其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,如果遇到死路就往回退,回退过程中如果遇到没探索过的支路,就进入该支路继续深入,每个节点只能访问一次。

深度优先搜索应用:先序遍历,中序遍历,后序遍历。二叉树的前序、中序、后序遍历,本质上可以认为是深度优先遍历。是一种回溯思想。

2.BFS(Breadth First Search):迭代法实现层序遍历,每次遍历二叉树的某一层。
它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。基本过程,BFS是从根节点开始,沿着树(图)的宽度遍历树(图)的节点。如果所有节点均被访问,则算法中止。一般用队列数据结构来辅助实现算法。

广度优先搜索应用:层序遍历、最短路径、求二叉树的最大高度、由点到面遍历图、拓扑排序

在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。

二叉树分类

满二叉树

如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。
如图所示:
在这里插入图片描述
这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树。

完全二叉树

在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。(连续)
在这里插入图片描述

平衡二叉搜索树

平衡二叉搜索树:又被称为AVL(Adelson-Velsky and Landis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

如图:
在这里插入图片描述
最后一棵 不是平衡二叉树,因为它的左右两个子树的高度差的绝对值超过了1。

二叉搜索树

前面介绍的树,都不用管数值的,而二叉搜索树是要参考数值的,二叉搜索树是一个有序树。
若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
它的左、右子树也分别为二叉排序树
下面这两棵树都是搜索树:
在这里插入图片描述
二叉搜索树中序遍历是从小到大的有序数组。

C++中map、set、multimap,multiset的底层实现都是平衡二叉搜索树,所以map、set的增删操作时间时间复杂度是logn,注意我这里没有说unordered_map、unordered_set,unordered_map、unordered_set底层实现是哈希表。

(文章部分参考代码随想录,链接: link

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

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

相关文章

win10使用小技巧二

1. 解决电脑更新后无法连接打印机问题 步骤:右击电脑 → 选择“管理” → 打开“服务和应用程序” → 双击“服务” → 找到“Print Spooler” → 双击打开 → 在“常规”中将“启动类型”改为“自动” → 点击“应用” → 点击“确定” → 重启电脑。 2. 提升电脑…

rocketmq-console可视化界面功能说明

rocketmq-console可视化界面功能说明 登录界面OPS(运维)Dashboard(驾驶舱)Cluster(集群)Topic(主题)Consumer(消费者)Producer(生产者)Message(消息)MessageTrace(消息轨迹) rocketmq-console是rocketmq的一款可视化工具,提供了mq的使用详情等功能。 本章针对于rock…

css使用伪元素after或者before的时候想要给after设置z-index无效

css使用伪元素after或者before的时候想要给after或者before设置一个层级关系,使该伪类写入的样式在box的下面,发现给box设置z-index无效, 需要找到父级元素,在父级元素上设置z-index值并且将伪类设置z-index:-1

在数字化时代,自助BI是数据价值最大化的必经之路

引言:在数字化时代,数据已成为企业最宝贵的资产之一。然而,仅仅拥有海量数据并不足以带来竞争优势,关键在于如何有效地分析并利用这些数据以指导决策、优化运营、提升客户体验,并最终实现业务的持续增长。在一章里笔者…

实验1 主成分分析

目 录 二、实验环境... 1 三、实验内容... 1 3.1 导入数据... 2 3.2 求相关系数矩阵.. 3 3.3 数据规范化处理.. 3 3.4 主成分分析... 4 四 实验心得... 5 一、实验目的 (1)理解主成分分析的思想; (2)掌握主成分分析方…

昇思25天学习打卡营第19天 | CycleGAN图像风格迁移互换

内容介绍: CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络,该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。 该模型一个重要应用领域是域迁移(Domain Adaptation),可以通俗地理解…

常用SQL语句(基础篇)

前言 查询的sql的结构是 select...from...where...group by...having...order by...limit... 写查询sql的时候需要按照如下顺序写 from,where(and,or,!),group by,select&#xf…

文件系统技术架构分析

一文读懂:什么是文件系统 ,有哪几类? ▉ 什么是文件系统? 技术大拿眉头皱了皱,忍住快要爆发的情绪。解释到: 数据以二进制形式存储于介质,但高低电平含义难解。文件系统揭秘这些二进制背后的意…

智能交通(3)——Learning Phase Competition for Traffic Signal Control

论文分享 https://dl.acm.org/doi/pdf/10.1145/3357384.3357900https://dl.acm.org/doi/pdf/10.1145/3357384.3357900 论文代码 https://github.com/gjzheng93/frap-pubhttps://github.com/gjzheng93/frap-pub 摘要 越来越多可用的城市数据和先进的学习技术使人们能够提…

代码随想录 数组部分+代码可在本地编译器运行

代码随想录 数组部分,代码可在本地编译器运行 文章目录 数组理论基础704.二分查找题目:思路二分法第一种写法二分法第二种写法 代码 27.移除元素题目:思路-双指针法代码 977.有序数组的平方题目思路-双指针代码 209.长度最小的子数组题目&am…

《Windows API 每日一练》8.4 edit控件

编辑类是最简单的预定义窗口类,而另一方面却又是最复杂的。当你用“edit”作为类名创建子窗口时,可以基于CreateWindow调用的x坐标、y坐标、宽度和高度参数定义一个矩形。这个矩形包含可编辑的文本。一旦子窗口控件获得输入焦点,你就可以输入…

黑色矩形块检测数据集VOC+YOLO格式2000张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2000 标注数量(xml文件个数):2000 标注数量(txt文件个数):2000 标注…

使用ifconfig命令获取当前服务器的内网IP地址

如何使用ifconfig命令获取当前服务器的内网IP地址呢? ifconfig eth0 | grep inet | awk {print $2}

Zookeeper分布式锁原理说明【简单易理解】

Zookeeper 非公平锁/公平锁/共享锁 。 1.zookeeper分布式锁加锁原理 如上实现方式在并发问题比较严重的情况下,性能会下降的比较厉害,主要原因是,所有的连接都在对同一个节点进行监听,当服务器检测到删除事件时,要通知…

2007-2022年 国内各上市公司绿色化转型数据.(Excel文件、dta文件、参考文献、计算方法与说明)

上市公司绿色化转型数据为研究者提供了评估企业在生态文明建设、循环经济和绿色管理方面表现的重要视角。以下是对中国各上市公司绿色化转型数据的介绍: 数据简介 定义:上市公司绿色化转型是指企业在发展模式上向可持续发展转变,实现资源节…

如何确保 PostgreSQL 在高并发写操作场景下的数据完整性?

文章目录 一、理解数据完整性二、高并发写操作带来的挑战三、解决方案(一)使用合适的事务隔离级别(二)使用合适的锁机制(三)处理死锁(四)使用索引和约束(五)批…

《linux系统内核设计与实现》-内核空间和用户空间的概念以及内核空间和用户空间的数据拷贝

1 内核空间和用户空间的概念 用户空间:0-3G 内核空间:3-4G PAGE_OFFSET配置用户空间和内核空间的界限 分离的原因: (1)处理器模式不同,权限不同 对于x86体系的cpu,用户空间代码运行在Ring3…

时间、查找、打包、行过滤与指令的运行——linux指令学习(二)

前言:本节内容标题虽然为指令,但是并不只是讲指令, 更多的是和指令相关的一些原理性的东西。 如果友友只想要查一查某个指令的用法, 很抱歉, 本节不是那种带有字典性质的文章。但是如果友友是想要来学习的,…

如何创建和规划 PMO 团队,并发挥其最大实际价值

在当今复杂多变的商业环境中,项目管理办公室(PMO)已成为许多组织中不可或缺的一部分。PMO 团队能够为企业的项目管理提供战略指导、资源协调、流程优化等支持,从而提升项目的成功率和组织的整体绩效。那么,如何创建和规…

【React】React18 Hooks 之 useReducer

目录 useReducer案例1:useReducer不带初始化函数案例2:useReducer带初始化函数注意事项1:dispatch函数不会改变正在运行的代码的状态注意事项2:获取dispatch函数触发后 JavaScript 变量的值注意事项3:触发了reducer&am…