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

数据结构:树、森林

二叉树与树结构差异

  • 树(一般树):树是一种数据结构,其中每个节点可以有任意数量的子节点(除了根节点和叶子节点外)。因此,一般树的节点在数组中的表示并不是那么直接,特别是当树不是完全二叉树时。

  • 二叉树:二叉树是一种特殊的树,其中每个节点最多有两个子节点(通常称为左子节点和右子节点)。这种结构使得二叉树在数组中的表示更加直接和高效,特别是当二叉树是完全二叉树或满二叉树时。

顺序存储的差异:
  • 一般树的顺序存储:对于一般树,由于其子节点的数量不固定,因此很难在数组中直接表示。如果尝试使用顺序存储,可能会导致大量的空间浪费,因为需要为不存在的子节点预留空间。此外,访问子节点和父节点的索引计算也会变得复杂,因为需要额外的数据结构(如指针或索引数组)来跟踪每个节点的子节点位置。

  • 二叉树的顺序存储:对于二叉树,特别是完全二叉树或满二叉树,顺序存储非常高效。每个节点都可以根据其在数组中的索引来直接访问其左子节点和右子节点(通过简单的数学计算)。同样,也可以通过索引计算来找到父节点。这种存储方式不仅节省了空间(因为没有为不存在的子节点预留空间),而且访问速度也很快。

总的来说就是树的顺序存储结构中,数组下标代表结点的编号,下标所存的内容指示了节点之间的关系,而二叉树的数组下标即表示结点的编号又指示了二叉树中各结点之间的关系。

应用场景:
  • 一般树的顺序存储:由于上述的空间浪费和访问复杂性,一般树的顺序存储并不常见。相反,它们更常使用链式存储(如通过指针连接节点),这样可以更灵活地表示任意数量的子节点。

  • 二叉树的顺序存储:二叉树的顺序存储特别适用于完全二叉树或满二叉树,以及那些可以通过某种方式(如旋转或修改)转化为这些特殊类型的二叉树。此外,顺序存储的二叉树在某些特定应用中(如堆排序中的堆结构)也非常有用。

结论:

二叉树和树的顺序存储结构在本质上是相似的,但由于二叉树结构的特殊性,它在顺序存储中更加高效和直接。对于一般树,顺序存储通常不是最佳选择,而链式存储则更为常见和实用。

 

树和二叉树是两种常见的树形数据结构,它们之间可以相互转换。这种转换在处理树形结构的问题时非常有用,因为二叉树具有一些特殊的性质(如左子树和右子树的明确区分)和高效的算法(如二叉搜索树、堆等)。以下是树和二叉树相互转换的详细过程:

树转换为二叉树

树转换为二叉树的过程通常基于“儿子兄弟表示法”。在这种表示法中,每个节点都有指向其第一个孩子和下一个兄弟节点的指针。在转换为二叉树时,我们可以将节点的第一个孩子视为二叉树的左孩子,将节点的下一个兄弟视为二叉树的右孩子。具体步骤如下:

  1. 添加虚根(可选):如果原树是一个森林(即多棵树),则首先添加一个虚根节点,将森林中的所有树作为这个虚根的子树。这一步是可选的,因为对于单棵树来说,不需要添加虚根。

  2. 转换过程

    • 对于树中的每个节点,将其第一个孩子节点作为二叉树的左孩子。
    • 将该节点的下一个兄弟节点(即与其共享同一父节点的下一个节点)作为二叉树的右孩子。
    • 递归地对每个子树执行上述操作。
  3. 去除虚根(如果添加了):在转换完成后,如果添加了虚根,则将其去除,得到最终的二叉树。

二叉树转换为树

二叉树转换为树的过程是上述转换的逆过程。具体步骤如下:

  1. 恢复兄弟关系
    • 从二叉树的根节点开始,遍历整棵树。
    • 对于每个节点,如果它存在右孩子,则将该右孩子视为原树中其左孩子的下一个兄弟节点。
    • 注意,在二叉树中,一个节点的左孩子和右孩子分别对应原树中的第一个孩子和下一个兄弟节点。
  2. 递归处理
    • 对二叉树的每个子树递归执行上述操作,以恢复整棵树的兄弟关系。
  3. 结果:最终得到的是一棵或多棵树的集合(如果原二叉树是由多个树的根节点组成的森林转换而来)。

注意事项

  • 在转换过程中,需要确保不会破坏原树或二叉树的结构。
  • 转换后的树或二叉树应保留原树的所有节点和边。
  • 如果原树是森林,则在转换为二叉树时需要添加虚根;在转换回树时,如果添加了虚根,则需要将其去除。

通过上述过程,我们可以实现树和二叉树之间的相互转换,从而在处理树形结构的问题时更加灵活和高效。

树的遍历

先根遍历:
  • 先访问根节点
  • 再依次访问根结点的每棵子树
  • 与该树对应的二叉树的先序序列相同
后根遍历:
  • 先依次遍历根结点的每棵子树,遍历子树时仍遵循先子树后根的原则
  • 再访问根结点
  • 与该树对应的二叉树的中序序列相同

森林的遍历

先序遍历森林:
  • 对森林中的树一次采用先序遍历
中序遍历森林:
  • 对森林中的树依次采用后根遍历 

树与二叉树的应用:

哈夫曼树(Huffman Tree)

又称最优二叉树,是一种具有特殊性质的二叉树结构。其定义及相关术语如下:

定义

给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,则称这样的二叉树为最优二叉树,也称为哈夫曼树。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。

相关术语
  1. 结点的权:在哈夫曼树中,每个结点都被赋予一个具有某种现实含义的数值,这个数值被称为该结点的权。权值可以表示结点的重要性、频率或其他任何需要优化的指标。

  2. 路径和路径长度

    • 路径:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路称为路径。
    • 路径长度:在一条路径中,每经过一个结点,路径长度增加1。若根结点所在层数为1,则从根结点到第L层结点的路径长度为L-1。
  3. 结点的带权路径长度(WPL):从根结点到该结点之间的路径长度与该结点的权的乘积。这个值反映了结点在整个树中的重要性与其位置的关系。

  4. 树的带权路径长度(WPL):树中所有叶结点的带权路径长度之和。对于哈夫曼树而言,其WPL是所有可能的二叉树中最小的。

  • 构造哈夫曼树
  1. 初始时,将给定的N个权值分别作为N棵仅含一个结点的二叉树的根结点,构成森林。
  2. 重复执行以下步骤,直到森林中只剩下一棵树为止:
    • 从森林中选出两棵根结点权值最小的树,将它们合并为一棵新的二叉树,新结点的权值为这两棵树根结点的权值之和。
    • 将新得到的树加入森林中,并删除原来的两棵树。

     3. 最终得到的树即为哈夫曼树

哈夫曼树的性质
  • 每个初始结点最终都成为叶结点,且权值越小的结点到根结点的路径长度越大。
  • 哈夫曼树的结点总数为2N-1,其中N为初始结点数(也即叶结点数)。
  • 哈夫曼树中不存在度为1的结点(即每个非叶结点都有两个子结点)。
  • 哈夫曼树并不唯一,但所有可能的哈夫曼树的WPL必然相同且为最优。

哈夫曼编码

基于哈夫曼树的一种数据压缩方法。通过对数据中的字符进行频率统计,构建哈夫曼树,并根据树的结构为字符分配不同的编码(通常是二进制编码),从而实现数据的压缩。哈夫曼编码有静态和动态两种形式,分别适用于不同的应用场景。

哈夫曼编码和定长编码:

哈夫曼编码是一种非常有效的数据压缩编码。由哈夫曼树得到哈夫曼编码是很自然的过程。首先,将每个字符当作一个独立的结点,其权值为它出现的频度(或次数),构造出对应的哈夫曼树。然后,将从根到叶结点的路径上分支标记的字符事作为该字符的编码。


这棵哈夫曼树的 WPL 为
 WPL =1x45+3x(13+12+16)+4x(5+9)=224
此处的 WPL 可视为最终编码得到二进制编码的长度,共224位。若采用3位固定长度编码,则得到的二进制编码长度为300位,因此哈夫曼编码共压缩了25%的数据。利用哈夫曼树可以设计出总长度最短的二进制前缀编码。 

总结:

哈夫曼树在数据压缩、信息论等领域有着广泛的应用。通过构建哈夫曼树,可以实现数据的高效压缩和解压缩,从而减少存储空间和传输时间。

相关文章:

数据结构:树、森林

二叉树与树结构差异 树(一般树):树是一种数据结构,其中每个节点可以有任意数量的子节点(除了根节点和叶子节点外)。因此,一般树的节点在数组中的表示并不是那么直接,特别是当树不是完…...

AI Agent应用出路到底在哪?

1 Agent/Function Call 的定义 Overview of a LLM-powered autonomous agent system: Agent学会调用外部应用程序接口,以获取模型权重中缺失的额外信息(预训练后通常难以更改),包括当前信息、代码执行能力、专有信息源…...

一文了解构建工具——Maven与Gradle的区别

目录 一、Maven和Gradle是什么? 构建工具介绍 Maven介绍 Gradle介绍 二、使用时的区别: 1、新建项目 Maven: Gradle: 2、配置项目 Maven: Gradle: 3、构建项目——生成项目的jar包 Gradle&…...

electron介绍

Electron中文文档 Electron是什么? Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。 Electron 允许开发者使用前端技术栈来创建可以在 Windows、macOS 和 Linux 等多个操作系统上运行的桌面应用程序。 Electron 本质上是一个运行在桌面操作…...

Redis-持久化

首先,我们明白一个概念, 硬盘>持久 内存>不持久 而Redis是一个内存数据库,不持久,相比于Mysql这样的关系型数据库,最明显的特点是快/效率高 为了保证速度快,数据要保存再内存中,为了持久,存储在硬盘上 所以redis决定: 插入>内存+硬盘(硬盘是为了在re…...

封装轮播图 (因为基于微博小程序,语法可能有些出入,如需使用需改标签)

这是在组件中使用&#xff0c;基于微博语法 <template><wbx-view class"" style"width: 100vw;height: 70vh;"><WBXswiper change"gaibian" :vertical"false" :current"current" indicatorActiveColor"…...

【Ubuntu】minicom安装、配置、使用以及退出

目录 1 安装 2 配置 3 使用 4 退出 minicom是一个串口通信的工具&#xff0c;以root权限登录系统&#xff0c;可用来与串口设备通信。 1 安装 sudo apt-get install minicom 2 配置 使用如下命令进入配置界面&#xff1a; sudo minicon -s 进入配置界面后&#xff0c;…...

MYSQL的监控

1. MySQL服务器都提供了哪几种类型的日志文件&#xff1f;说明每种日志的用途。 Error log&#xff1a;启动、关闭和异常有关的诊断信息 General query log:服务器从客户端收到的所有语句 Slow query log:需要很长时间执行的查询 Audit log:企业版基于策略的审计 Binary…...

CTF ciscn_2019_web_northern_china_day1_web2

ciscn_2019_web_northern_china_day1_web2 BEGIN 拿到题目&#xff0c;先看看 这里发现一个很像提示的东西&#xff0c;然后发现下面是一堆小电视商品&#xff0c;有lv等级和金钱&#xff0c;所以这题的入口可能就是再lv6和这个资金募集上 然后点击下next&#xff0c;看看页…...

linux中vim编辑器的应用实例

前言 Linux有大量的配置文件&#xff0c;其中编辑一些配置文件&#xff0c;最常用的工具就是 Vim &#xff0c;本文介绍一个实际应用的Vim编辑器开发文档的实例。 Vim是一个类似于Vi的著名的功能强大、高度可定制的文本编辑器&#xff0c;在Vi的基础上改进和增加了很多特性。…...

智慧城市交通管理中的云端多车调度与控制

城市交通管理中的云端多车调度与控制 智慧城市是 21世纪的城市基本发展方向&#xff0c;为了实现智慧城市建设的目标&#xff0c;人们需要用现代化的手段去管理和控制城市中的各种资源和设施。智能交通控制与管理是智慧城市中不可缺少的一部分&#xff0c;因为现代城市交通系统…...

分治(归并排序)

一、基本思路 我们以一个归并排序为例。 . - 力扣&#xff08;LeetCode&#xff09; 归并排序的思想&#xff1a;得到两个有序数组&#xff0c;把两个有序数组合并&#xff0c;传到下一层递归&#xff0c;一直得到两个有序数组&#xff0c;一直合并&#xff0c;最后就能得到有…...

小学生为什么要学英语

小学生需要学习英语的原因有很多&#xff0c;以下是其中的一些原因&#xff08;毕竟我也会累滴(*&#xffe3;▽&#xffe3;*)&#xff09;&#xff1a; 1. 全球化交流&#xff1a;英语是国际交流的通用语言&#xff0c;学习英语可以帮助小学生更好地融入全球化的社会环境&am…...

企业云存储如何收费?企业云存储收费标准

企业云存储如何收费&#xff1f;企业云存储的收费方式因不同的服务提供商和具体的服务选项而异&#xff0c;通常从用户数量、存储容量、功能、混合收费、按需定价、定制化、功能模块等多个方面进行考量。以下是对其多方面收费方式的详细介绍&#xff1a; 1.按用户数量收费 适用…...

一步步教你LangGraph Studio:可视化调试基于LangGraph构建的AI智能体

之前我们在第一时间介绍过使用LangChain的LangGraph开发复杂的RAG或者Agent应用&#xff0c;随着版本的迭代&#xff0c;LangGraph已经成为可以独立于LangChain核心&#xff0c;用于开发多步骤、面向复杂任务、支持循环的AI智能体的强大框架。 近期LangGraph推出了一个使得复杂…...

用SpringBoot打造先进的学科竞赛管理系统

1绪 论 1.1研究背景 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理&#xff0c;这正是计算机被广泛应用于信息管理系统的环境。计算机的最大好处在于利用它能够进行信息管理。使用计算机进行信息控制&#xff0c;不仅提高了工作效率&#xff0c;而且大大的提高了其…...

Linux入门攻坚——34、nsswitch、pam、rsyslog和loganalyzer前端展示工具

nsswitch&#xff1a;network service switch 名称解析&#xff1a;name <---> id 认证服务&#xff1a;用户名、密码验证或token验证等 名称解析和认证服务都涉及查找位置&#xff0c;即保存在哪里。如linux认证&#xff0c;passwd、shadow&#xff0c;是在文件中&…...

如何在Excel中快速找出前 N 名,后 N 名

有如下销售额统计表&#xff1a; 找出销售额排前 10 名的产品及其销售额&#xff0c;和销售额排倒数 10 名以内的产品及其销售额&#xff0c;结果如下所示&#xff1a; 前 10 名&#xff1a; spl("E(?1).sort(ProductSales:-1).to(10)",A1:C78)后 10 名&#xff1…...

创意实现!在uni-app小程序商品详情页轮播中嵌入视频播放功能

背景介绍 通过uni-app框架实现商城小程序商品详情页的视频与图片轮播功能&#xff0c;以提升用户体验和增加商品吸引力。通过展示商品视频和图片&#xff0c;用户可以更全面地了解商品细节&#xff0c;从而提高购买决策的便利性和满意度。这种功能适用于各类商品&#xff0c;如…...

WAF,全称Web Application Firewall,好用WAF推荐

WAF&#xff0c;全称Web Application Firewall&#xff0c;即Web应用防火墙&#xff0c;是一种网络安全设备&#xff0c;旨在保护Web应用程序免受各种Web攻击&#xff0c;如SQL注入、跨站脚本&#xff08;XSS&#xff09;、跨站请求伪造&#xff08;CSRF&#xff09;等。 WAF通…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发&#xff08;电脑上写的程序&#xff09;涉及到的一套技术Qt无法开发网页前端&#xff0c;也不能开发移动应用。 客户端开发的重要任务&#xff1a;编写和用户交互的界面。一般来说和用户交互的界面&#xff0c;有两种典型风格&…...

Linux-进程间的通信

1、IPC&#xff1a; Inter Process Communication&#xff08;进程间通信&#xff09;&#xff1a; 由于每个进程在操作系统中有独立的地址空间&#xff0c;它们不能像线程那样直接访问彼此的内存&#xff0c;所以必须通过某种方式进行通信。 常见的 IPC 方式包括&#…...