当前位置: 首页 > news >正文

数据结构之树

基础知识:

树是一种非线性结构,其严格的数学定义是:如果一组数据中除了第一个节点(第一个节点称为根节点,没有直接前驱节点)之外,其余任意节点有且仅有一个直接前驱,有零个或多个直接后继,这样的一组数据形成一棵树。这种特性简称为一对多的逻辑关系。

树的基本术语

树是由若干个节点组成的分支,每个节点都可能组成一棵树

1.根(root):

树的第一个节点,没有直接前驱如上图的A,

2.双亲节点(parent):

某节点的直接前驱称为该节点的双亲节点,或称为父节点,例如上图A 是B的父节点。

3.孩子节点(child):

某节点的直接后继称为该节点的孩子节点,例如上图中的B、C、D均为 A的孩子节点。

4.节点的层次(level):

从树根开始,根为第一层,根的孩子为第二层,树中节点的最大层次 称为树的深度或者高度。比如上图中节点E的层次是3.

5.节点的度(degree):

节点拥有的子树的数量,称为该节点的度,度为0的节点称为叶子节点或者终端节点,度不为0的节点,称为非终端节点或者分支节点,比如上图节点B的度为2。

6.叶子(leaf):

一棵树中度等于0的节点,称为叶子节点,如上图K,L,G,M,I为叶子

二叉树 

二叉树是一种属性结构,他的特性是每个节点最多只有两棵子树,即二叉树中不存在度大于2的节点,并且二叉树的子树有左右之分,其次序不能任意颠倒。

二叉树的形态可以多种多样,但通常有以下几种基本形态:

  1. 满二叉树(Full Binary Tree)

  2. 完全二叉树(Complete Binary Tree)

  3. 平衡二叉树(Balanced Binary Tree)

  4. 二叉搜索树(Binary Search Tree, BST)

  5. 哈夫曼树(Huffman Tree)

遍历

深度优先遍历

前中后序遍历,都是递归算法。前序遍历为例,当访问完根节点,进而要访问左子树时,由于左子树本身一棵二叉树,因此也需要进行前序遍历,也就是先访问左子树的根节点,然后再依次访问左子树的左孩子和左子树的右孩子。

  • 前序遍历 : 根节点 - 左子树 - 右子树(F-BADCE-GIH)
  • 中序遍历 : 左子树 - 根节点 -右子树(ABCDE-F-GHI)
  • 后序遍历 : 左子树 - 右子树 - 根节点(ACEDB-HIG-F)

广度优先遍历

  • 按层遍历:从上到下,从左到右

特点

  1. 在二叉树的第i层上最多有2^(i-1)个节点(i>=0)
  2. 深度为K的二叉树最多有2^k-1个节点
  3. 对任意一颗二叉树T,如果其叶子节点数为n0,度为2的节点为n2,则有n2 = n0-1

存储结构

存储结构:即保存了元素又保存了关系(根据二叉树的信息可以把二叉树还原)

  • 顺序存储结构

由于在顺序存储,数据之间的逻辑关系是用物理位置来表达,而二叉树中每一个节点都有一个对应的标号,因此可以使用标号来作为数组的下标,但除非是完全二叉树,否则会浪费存储空间,

  • 链式存储结构

链式存储思路与链表类似,使用指针来直接将节点的逻辑关系串联起来

满二叉树

  • 一棵深度为k且具备有2^k-1个节点的二叉树,称为满二叉树,在不改变深度的情况下,无法再往这棵树上加节点。

完全二叉树

  1. 除去最后一层后为满二叉树
  2. 最后一层的节点必须一次从左往右边排(左边不排满,就不要排右边),完全二叉树的特性是不浪费空间

二叉搜索树(BST)

按照"小-中-大"(或"大-中-小")的规律来存储数据,即对于任意一个节点,都可以明确找到其值大于或等于其左孩子节点,且小于或等于其有孩子节点。

平衡二叉树(AVL)

它或者是一棵空树,或者是具有以下特性的二叉搜索树(BST)

  1. 它的左子树或者右子树都是平衡二叉树
  2. 左子树和右子树的深度之差的绝对值不超过1(1,-0,-1)

将二叉树上的节点的平衡因子定义为该节点的左子树的深度减去它右子树的深度,当平衡因子的绝对值大于1,则该二叉树不平衡。

不平衡二叉树转变为平衡二叉树

单向右旋平衡处理

 单向左旋平衡处理

 双向旋转(先左后右)平衡处理

 双向旋转(先右后左)平衡处理

 哈夫曼树

又称最优二叉树,是一种特殊的二叉树。

构造

带权路径长度

每层叶子结点*对应层权值之和(6+8+11)*2+(2+5)*3=71

相关文章:

数据结构之树

基础知识: 树是一种非线性结构,其严格的数学定义是:如果一组数据中除了第一个节点(第一个节点称为根节点,没有直接前驱节点)之外,其余任意节点有且仅有一个直接前驱,有零个或多个直接…...

6毛钱SOT-23封装28V、400mA 开关升压转换器,LCD偏置电源和白光LED应用芯片TPS61040

SOT-23-5 封装 TPS61040 丝印PHOI 1 特性 • 1.8V 至 6V 输入电压范围 • 可调节输出电压范围高达 28V • 400mA (TPS61040) 和 250mA (TPS61041) 内部开关电流 • 高达 1MHz 的开关频率 • 28μA 典型空载静态电流 • 1A 典型关断电流 • 内部软启动 • 采用 SOT23-5、TSOT23…...

saga模型

​ Saga源于Hector Garcaa-Molrna和Kenneth Salem发表的论文Sagas。一个LLT事务(Long Lived Transaction)可以分成若干个小的事务执行单元,这些小执行单元就是saga事务。Saga方案更适合用于长事务场景。Saga模型将一个分布式事务拆分为多个本…...

深度神经网络:解锁智能的密钥

深度神经网络:解锁智能的密钥 在人工智能的浩瀚星空中,深度神经网络(Deep Neural Networks, DNNs)无疑是最耀眼的那颗星。它以其强大的学习能力、高度的适应性和广泛的应用场景,成为了我们解锁智能世界的一把密钥。本…...

国际现货黄金最新价格如何分析?结合较高的时间周期

国际现货黄金投资是一种24小时交易的品种,这意味着,在交易日我们打开电脑图表,分析完走势之后就有机会做交易了。但问题也出在这里,如果对国际现货黄金最新价格把握不住,分析和交易就无从谈起了,下面我们就…...

微服务和kafka

一、微服务简介 1.单体架构 分布式--微服务--云原生 传统架构(单机系统),一个项目一个工程:比如商品、订单、支付、库存、登录、注册等等,统一部署,一个进程 all in one的架构方式,把所有的…...

Jetpack架构组件_Navigaiton组件_1.Navigaiton切换Fragment

1.Navigation主要作用 方便管理Fragment (1)方便我们管理Fragment页面的切换 (2)可视化的页面导航图,便于理清页面间的关系。 (3)通过destination和action完成页面间的导航 (4&a…...

[计算机网络] 虚拟局域网

虚拟局域网 VLAN(Virtual Local Area Network,虚拟局域网)是将一个物理的局域网在逻辑上划分成多个广播域的技术。 通过在交换机上配置VLAN,可以实现在同一个VLAN 内的用户可以进行二层互访,而不同VLAN 间的用户被二…...

LabVIEW遇到无法控制国外设备时怎么办

当使用LabVIEW遇到无法控制国外产品的问题时,解决此类问题需要系统化的分析和处理方法。以下是详细的解决思路和具体办法,以及不同方法的分析和比较,包括寻求代理、国外技术支持、国内用过的人请教等内容。 1. 了解产品的通信接口和协议 思路…...

.hmallox勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

导言: 在当今数字化时代,勒索病毒已经成为网络安全的一大威胁,其中包括了最近出现的.hmallox勒索病毒。这类恶意软件不仅能够对计算机系统进行加密,还会要求用户支付赎金以换取解密密钥,给个人用户和企业带来了严重的…...

Redis发布、订阅模式(Pub/Sub)详解

Redis发布、订阅模式(PUB-SUB)详解 Redis的发布订阅(Pub/Sub)机制是一种消息通信模式,用于消息的广播。它允许多个客户端订阅(Subscribe)特定的频道(Channel)&#xff0c…...

Django-开发一个列表页面

需求 基于ListView,创建一个列表视图,用于展示"BookInfo"表的信息要求提供分页提供对书名,作者,描述的查询功能 示例展示: 1. 数据模型 models.py class BookInfo(models.Model):titlemodels.CharField(verbose_name"书名",max_length100)authormode…...

flink 处理函数和流转换

目录 处理函数分类 概览介绍 KeydProcessFunction和ProcessFunction 定时器TimeService 窗口处理函数 多流转换 分流-侧输出流 合流 联合(Uniion) 连接(connect) 广播连接流(BroadcatConnectedStream&#xf…...

详细分析Springmvc中的@ModelAttribute基本知识(附Demo)

目录 前言1. 注解用法1.1 方法参数1.2 方法1.3 类 2. 注解场景2.1 表单参数2.2 AJAX请求2.3 文件上传 3. 实战4. 总结 前言 将请求参数绑定到模型对象上,或者在请求处理之前添加模型属性 可以在方法参数、方法或者类上使用 一般适用这几种场景: 表单…...

和利时SIS安全系统模块SGM210 SGM210-A02

和利时SIS安全系统模块SGM210 SGM210-A02 阀门定位器:(福克斯波罗, YTC,山武) PLC:(西门子,施耐德,ABB,AB,三菱,欧姆龙) 泵阀:(力士…...

浔川3样AI产品即将上线!——浔川总社部

浔川3样AI产品即将上线! 浔川AI翻译v3.0 即将上线! 浔川画板v5.1 即将上线! 浔川AI五子棋v1.4 即将上线! 整体通告详见:浔川AI五子棋(改进(完整)版1.3)——浔川python社…...

小阿轩yx-MySQL索引、事务

小阿轩yx-MySQL索引、事务 MySQL 索引介绍 是一个排序的列表,存储着索引的值和包含这个值的数据所在行的物理地址数据很多时,索引可以大大加快查询的速度使用索引后可以不用扫描全表来定位某行的数据而是先通过索引表找到该行数据对应的物理地址然后访…...

搞定求职难题:工作岗位列表+简历制作工具 | 开源专题 No.75

SimplifyJobs/New-Grad-Positions Stars: 8.5k License: NOASSERTION 这个项目是一个用于分享和跟踪美国、加拿大或远程职位的软件工作机会列表。该项目的核心优势和关键特点如下: 自动更新新岗位信息便捷地提交问题进行贡献提供一键申请选项 BartoszJarocki/cv…...

JavaWeb——MySQL数据库:约束

目录 1. 约束 1.1 概念: 1.2 分类: 1.3 使用: 1.4 外键约束; 1.5 总结 数据库:数据库都有约束,数据库设计,多表查询,事物这四方面的知识; 我们先按这个顺序进行学习&#xff…...

JS(JavaScript)入门指南(DOM、事件处理、BOM、数据校验)

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。 玉阶生白露,夜久侵罗袜。 却下水晶帘,玲珑望秋月。 ——《玉阶怨》 文章目录 一、DOM操作1. D…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 ​…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域:无处不在的数字助手 2、 计算机的进化史:从算盘到量子计算 3、计算机的分类:不止 “台式机和笔记本” 4、计算机的组件:硬件与软件的协同 4.1 硬件:五大核心部件 4.2 软件&#…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型(算法、数据分析、机器学习等)不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...