二叉树(上)

news2024/10/12 12:27:05

   “路虽远,行则将至”

❤️主页:小赛毛

目录

1.树概念及结构

1.1树的概念

1.2 树的相关概念

 1.3 树的表示(树的存储)

2.二叉树概念及结构

2.1概念

2.2现实中的二叉树

2.3 特殊的二叉树:

2.4 二叉树的性质 

3.二叉树的顺序结构及实现

3.1 二叉树的顺序结构

3.2 堆的概念及结构

3.3 堆的实现

3.2.1 堆向下调整算法

 3.2.2堆的创建

前言:

在进入今天的正题之前,我们先来回顾一下我们已经学过的知识:

顺序的本质是什么呢?数组

但是呢,顺序表在这里是有一些缺陷的:

1.中间或者头部插入删除数据要挪动数据,效率低

2.空间不够,只能扩容。扩容有消耗

3.倍数扩容,用不完,存在空间浪费

当然,有利有弊,优点:

1.下标随机访问。排序 二分查找适合

2.CPU高速缓存命中率比较高

在我们学完顺序表之后呢,我们当时顺序就学了链表:

在这里呢,我们要请出链表的典型代表——带头结点的双向循环链表 同志来参加。

优点:

1.任意位置插入删除效率高

2.按需申请释放,不存在扩容

缺点:

1.不能下标随机访问

2.CPU高速缓存命中率低


1.树概念及结构

1.1树的概念

树是一种 非线性 的数据结构,它是由 n n>=0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的
  • 有一个特殊的结点,称为根结点,根节点没有前驱结点
  • 除根节点外,其余结点被分成M(M>0)个互不相交的集合T1T2……Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继
  • 因此,树是递归定义的。

注意:树形结构中,子树之间不能有交集,否则就不是树形结构

1.2 树的相关概念

  • 节点的度:一个节点含有的子树的个数称为该节点的度;如上图:A的为6
  • 叶节点或终端节点:度为0的节点称为叶节点;如上图:BCHI...等节点为叶节点
  • 非终端节点或分支节点:度不为0的节点;如上图:DEFG...等节点为分支节点
  • 双亲节点或父节点:若一个节点含有子节点,则这个节点称为其子节点的父节点;如上图:AB的父节点
  • 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点;如上图:BA的孩子节点
  • 兄弟节点:具有相同父节点的节点互称为兄弟节点;如上图:BC是兄弟节点
  • 树的度:一棵树中,最大的节点的度称为树的度;如上图:树的度为6
  • 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推;
  • 树的高度或深度:树中节点的最大层次;如上图:树的高度为4
  • 堂兄弟节点:双亲在同一层的节点互为堂兄弟;如上图:HI互为兄弟节点
  • 节点的祖先:从根到该节点所经分支上的所有节点;如上图:A是所有节点的祖先
  • 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。如上图:所有节点都是A的子孙
  • 森林:由mm>0)棵互不相交的树的集合称为森林;(并查集里面就是多棵树)

 1.3 树的表示(树的存储)

树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了, 既然保存值域,也要保存结点和结点之间 的关系 ,实际中树有很多种表示方式如:双亲表示法,孩子表示法、孩子双亲表示法以及孩子兄弟表示法 等。我们这里就简单的了解其中最常用的孩子兄弟表示法
下面就给大家展示一下这个贼🐂🍺的方法( 左孩子、右兄弟表示法):
struct TreeNode
{
    int val;
    struct TreeNode* firstchild;//第一个孩子节点
    struct TreeNode* nextbroyher;//指向其下一个兄弟节点
}

双亲表示法(只存储父亲的下标或指针)

在很多地方,双亲表示法一般就是用数组的方式直接玩 

这个地方就可以很容易判断出来有几棵树,有几个兄弟。

于是否,两个节点在不在同一棵树,如何判断?

找根,根相同就在同一棵树


其实呢,在实际生活中,我们用的最多的实际上是二叉树

2.二叉树概念及结构

2.1概念

从上图可以看出:
1. 二叉树不存在度大于 2 的结点 (最多两个孩子 也可以是一个或零个)
2. 二叉树的子树有左右之分,次序不能颠倒,因此二叉树是有序树
注意:对于任意的二叉树都是由以下几种情况复合而成的:

2.2现实中的二叉树

2.3 特殊的二叉树:

1. 满二叉树 (假设它有h层,每一层都是满的) :一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2的k次方-1 则它就是满二叉树。
2. 完全二叉树 :完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为 K 的,有n 个结点的二叉树,当且仅当其每一个结点都与深度为 K 的满二叉树中编号从 1 n 的结点一一对应时称之为完全二叉树。 要注意的是满二叉树是一种特殊的完全二叉树。

2.4 二叉树的性质 

 

1.若规定根节点的层数为 1 ,则一棵非空二叉树的 i 层上最多有 2^(i-1)个结点.
2. 若规定根节点的层数为 1 ,则 深度为 h 的二叉树的最大结点数是2^h-1
3. 对任何一棵二叉树 , 如果度为 0 其叶结点个数为n0  , 度为 2 的分支结点个数为n2  , 则有 n0=n2 + 1
4. 若规定根节点的层数为 1 ,具有 n 个结点的满二叉树的深度 h= log以 2 为底,n+1 为对数
5. 对于具有 n 个结点的完全二叉树,如果按照从上至下从左至右的数组顺序对所有节点从 0 开始编号,则对于序号为i 的结点有:
1. i>0 i 位置节点的双亲序号: (i-1)/2 i=0 i 为根节点编号,无双亲节点
2. 2i+1<n ,左孩子序号: 2i+1 2i+1>=n 否则无左孩子
3. 2i+2<n ,右孩子序号: 2i+2 2i+2>=n 否则无右孩子

3.二叉树的顺序结构及实现

3.1 二叉树的顺序结构

  parent = (child-1) / 2

任意位置通过下标可以找父亲或者孩子

那如果不是满二叉树或者完全二叉树的话,还适合这个规律吗?显然不可以

那我们这里可以进行总结:

满二叉树 或者 完全二叉树适合用数组存储


3.2 堆的概念及结构

堆的性质:
堆中某个节点的值总是不大于或不小于其父节点的值;
堆总是一棵完全二叉树。

3.3 堆的实现

3.2.1 堆向下调整算法

 我们在这里先来说明一下:

栈:线性表,后进先出

堆:非线性表,完全二叉树

小堆:树中任意一个父亲都 ≤ 孩子

大堆:树中任意一个父亲都 ≥ 孩子

现在我们给出一个数组,逻辑上看做一颗完全二叉树。我们通过从根节点开始的向下调整算法可以把它调整成一个小堆。向下调整算法有一个前提:左右子树必须是一个堆,才能调整。
intarray[] = {27,15,19,18,28,34,65,49,25,37};

 

底层:

  • 物理结构:数组
  • 逻辑结构:完全二叉树

小堆,底层数组是否升序呢?不一定

小堆的根是整棵树的最小值

 3.2.2堆的创建

下面我们给出一个数组,这个数组逻辑上可以看做一颗完全二叉树,但是还不是一个堆,现在我们通过算法,把它构建成一个堆。根节点左子树不是堆,我们怎么调整呢?这里我们从倒数的第一个非叶子节点的子树开始调整,一直调整到根节点的树,就可以调整成堆。
inta[] = {1,5,3,8,7,6}; 

 

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

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

相关文章

安全基础 --- 原型链污染

原型链 大部分面向对象的编程语言&#xff0c;都是通过“类”&#xff08;class&#xff09;实现对象的继承。传统上&#xff0c;JavaScript 语言的继承不通过 class&#xff0c;而是通过“原型对象”&#xff08;prototype&#xff09;实现 1、prototype 属性的作用 JavaScri…

【云原生进阶之PaaS中间件】第一章Redis-1.4过期策略

1 设置带过期时间的 key # 时间复杂度&#xff1a;O&#xff08;1&#xff09;&#xff0c;最常用方式 expire key seconds# 字符串独有方式 setex(String key, int seconds, String value)除了string独有设置过期时间的方法&#xff0c;其他类型都需依靠expire方法设置时间&a…

高效数据湖构建与数据仓库融合:大规模数据架构最佳实践

文章目录 数据湖和数据仓库&#xff1a;两大不同理念数据湖数据仓库 数据湖与数据仓库的融合统一数据目录数据清洗和转换数据安全和权限控制数据分析和可视化 数据湖与数据仓库融合的优势未来趋势云原生数据湖自动化数据处理边缘计算与数据湖融合 结论 &#x1f389;欢迎来到云…

盲盒游戏的盈利原理

盲盒游戏&#xff0c;一种极具不确定性的娱乐方式&#xff0c;以其独特的魅力和盈利模式吸引了大量消费者和商家的关注。本文将从盲盒App的盈利模式、随机性、极低成本和超高复购率四个方面&#xff0c;深入剖析其盈利原理。 一、盈利模式 盲盒App的盈利模式主要是通过…

Kafka3.0.0版本——消费者(Range分区分配策略以及再平衡)

目录 一、Range分区分配策略原理1.1、Range分区分配策略原理的示例一1.2、Range分区分配策略原理的示例二1.3、Range分区分配策略原理的示例注意事项 二、Range 分区分配策略代码案例2.1、创建带有4个分区的fiveTopic主题2.2、创建三个消费者 组成 消费者组2.3、创建生产者2.4、…

学会用命令行创建uni-app项目并用vscode开放项目

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 创建 uni-app 项目 命令行创建 uni-app 项目 编译和运行 uni-app 项目&#xff1a; 用 VS Code 开发 uni…

深入浅出学Verilog--基础语法

1、简介 Verilog的语法和C语言非常类似&#xff0c;相对来说还是非常好学的。和C语言一样&#xff0c;Verilog语句也是由一连串的令牌&#xff08;Token&#xff09;组成。1个令牌必须由1个或1个以上的字符&#xff08;character&#xff09;组成&#xff0c;令牌可以是&#x…

前端通过第三插件uuid 生成一个 uuid

有时候 后端会让我们自己生成一个uuid 我们没必要自己去写 直接用第三方插件就好了 先终端执行 npm install uuid这样 我们第三方插件就进来了 然后 引入一定要根据环境来 //TS环境引入 import { v4 as uuidv4 } from uuid; //js环境引入 const { v4: uuidv4 } require(uui…

Ubuntu 20.04出现蓝牙无法打开的问题(已解决)

安装Ubuntu20.04后&#xff0c;蓝牙无法打开&#xff0c;按钮开启后蓝牙仍处于关闭状态 解决方法&#xff08;四种方式&#xff09; 1.卸载并重新加载btusb内核模块&#xff08;支持蓝牙设备的内核模块&#xff09; sudo rmmod btusb sleep 1 sudo modprobe btusb2、安装蓝牙工…

OpenRoads Designer道路边坡渐变过渡之二点特征名称覆盖

点特征名称覆盖在模板内进行设置&#xff0c;因此使用点特征名称覆盖实现边坡外口连续适用于使用一个模板创建的一段道路&#xff08;廊道&#xff09;模型内出现的边坡开口线间断的情况&#xff0c;对于使用多个模板创建的一系列首尾相连的道路模型&#xff0c;在相邻模型间出…

性能测试中TPS上不去的几种原因

中TPS一直上不去&#xff0c;是什么原因&#xff1f; 这篇文章&#xff0c;就具体说说在实际压力测试中&#xff0c;为什么有时候TPS上不去的原因。 先来解释下什么叫TPS&#xff1a; TPS&#xff08;Transaction Per Second&#xff09;&#xff1a;每秒事务数&#xff0c;…

腾讯云学生专属便宜云服务器如何购买?

随着云计算技术的快速发展&#xff0c;越来越多的学生开始关注和使用云服务器。腾讯云作为国内知名的云计算服务提供商&#xff0c;推出了一系列针对学生的优惠活动&#xff0c;让更多学生能够享受到云服务器的便利和优势。本文将详细介绍如何购买腾讯云学生专属的便宜云服务器…

java 集成免费虹软人脸识别 SDK,实现人脸识别认证功能

系列文章目录 引入本地 jar 包教程&#xff1a; https://blog.csdn.net/demo_yo/article/details/132495029 文章目录 系列文章目录前言一、SDK 下载二、SDK 集成1、jar 依赖包2、dll 链接文件 三、API 集成1、yaml 配置2、Properties 配置类3、Factory 工厂类4、Service 服务…

类加载流程

文档链接&#xff1a; https://www.processon.com/view/link/64fc101a00a5c32bca7fe12e 访问密码&#xff1a;e3x8

亚马逊测评工作室怎么赚钱?

测评工作室的盈利方式主要来自于以下几种&#xff1a; 佣金&#xff1a;市场价基本上做免评单一单30、留评50单&#xff0c;会根据市场价实施波动&#xff0c;如果一个人今天做30单的留评单就是30单*501500元汇率差&#xff1a;即使用实时汇率进行结算时的差额&#xff0c;假设…

性能测试系列专题集合

下方查看历史精选文章 重磅发布 - 自动化框架基础指南pdfv1.1大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 从终端用户感受来体验性能指标度量如何建立…

3000字详解!什么是护网行动?什么是红蓝对抗?

一、什么是护网行动&#xff1f; 护网行动是以公安部牵头的&#xff0c;用以评估企事业单位的网络安全的活动。 具体实践中。公安部会组织攻防两方&#xff0c;进攻方会在一个月内对防守方发动网络攻击&#xff0c;检测出防守方&#xff08;企事业单位&#xff09;存在的安全…

04_瑞萨GUI(LVGL)移植实战教程之驱动LCD屏(SPI)

本系列教程配套出有视频教程&#xff0c;观看地址&#xff1a;https://www.bilibili.com/video/BV1gV4y1e7Sg 4. 驱动LCD屏(SPI) 本次实验我们在上一次实验的基础上驱动 LCD屏(SPI)。 上次实验我们已经能驱动触摸屏(I2C)并打印触摸点坐标&#xff0c;这次实验我们的目标是点…

无涯教程-JavaScript - IMSINH函数

描述 MSINH函数以x yi或x yj文本格式返回复数的双曲正弦值。复数的双曲正弦通过以下公式计算- $$\sinh(x yi) \sinh(x)\cos(y)-\cosh(x)\sin(y)i $$ 语法 IMSINH (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the hyperbol…

渗透测试流程是什么?7个步骤给你讲清楚!

在学习渗透测试之初&#xff0c;有必要先系统了解一下它的流程&#xff0c;静下心来阅读一下&#xff0c;树立一个全局观&#xff0c;一步一步去建设并完善自己的专业领域&#xff0c;最终实现从懵逼到牛逼的华丽转变。渗透测试是通过模拟恶意黑客的攻击方法&#xff0c;同时也…