数据结构:树、森林

news2024/9/28 22:59:45

二叉树与树结构差异

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

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

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

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

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

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

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

结论:

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

 

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

树转换为二叉树

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

  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%的数据。利用哈夫曼树可以设计出总长度最短的二进制前缀编码。 

总结:

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

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

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

相关文章

赵长鹏今日获释,下一步会做什么?币安透露2024年加密货币牛市的投资策略!

中国时间2024年9月28日,加密货币行业的风云人物赵长鹏(Changpeng Zhao,简称CZ)终于从监狱获释。他因在担任币安首席执行官期间未能有效执行反洗钱(AML)计划而被判刑四个月。赵长鹏的获释引发了广泛关注,不仅因为他是全…

一不小心,给腾讯云提了一个Bug

大家好,这里是程序员晚枫。 我使用腾讯的cos服务2年多了,一直都是在网页手动管理资源。 最近身边有高人”突发奇想“:要不自己封装一个专用的api?于是苦命打工人晚枫上线,吭哧吭哧把腾讯已经封装很好的Python SDK又包…

企业微信(企微)审批与影刀RPA结合

企业微信审批与影刀RPA结合 效果先看视频: 影刀与企业微信审批结合 具体步骤: 1、登录企微管理后台,新建一个审批流。 添加模板→自定义模板,根据需求添加审批节点。 添加完之后,回到审批界面,可以看…

Java新手指南:从菜鸟到编程大师的趣味之路-多态

这里是Themberfue 本章讲的是Java三大特性之一的多态,也是最后一个特性 多态概念 既然我们要学习多态,首先得知道这玩意儿到底是个什么东西? 通俗地说,多态其实就是多种形态。具体来说就是去完成某个行为,当不同的对象…

win11电脑长时间锁屏会变得非常卡(rundll.32过多)——解决方法

一、问题 当你长时间锁屏后,电脑会变得十分的卡,有些甚至会死机崩溃,这个时候你可能并不需要修改电源的计划设置,也可能并不需要修改电脑注册表之类的东西。 赶紧打开你的任务管理器,winx,选择任务管理器…

利士策分享,攀登职场高峰:成功者的十大特质

利士策分享,攀登职场高峰:成功者的十大特质 在职场这个竞争激烈的舞台上,那些能够迅速崛起、实现职业辉煌的佼佼者,往往凭借一系列独特且鲜明的特质脱颖而出。以下是对这些特质的深入探讨: 第一章:高情商的…

Elasticsearch学习笔记(1)

初识 Elasticsearch 认识和安装 Elasticsearch 是由 Elastic 公司开发的一套强大的搜索引擎技术,属于 Elastic 技术栈的一部分。完整的技术栈包括: Elasticsearch:用于数据存储、计算和搜索。Logstash/Beats:用于数据收集。Kib…

代码为笔,合作作墨,共绘共赢画卷———未来之窗行业应用跨平台架构

合作共赢,代码同创,成就非凡 一、资源整合方面 1.1. 技术资源共享 - 不同的合作伙伴可能在技术领域各有所长。例如,一方可能擅长前端用户界面设计,具有丰富的交互设计经验,能够打造出美观、易用的预订界面&#xff…

云舟观测:集成开源Grafana Faro构建前端页面性能监控平台

在当今互联网时代,面对纷乱繁杂的网上资源,用户的耐心和注意力是极为宝贵的资源,当用户访问一个网站或应用时,他们期望的是快速且无缝的体验,任何加载延迟或功能故障都可能导致用户流失,影响品牌体验。因此…

MySQL 中的 FOREIGN KEY 约束:确保数据完整性的关键

在 MySQL 数据库中,FOREIGN KEY(外键)约束是一种非常重要的机制,它可以帮助我们确保数据的完整性和一致性。那么,FOREIGN KEY 约束究竟是什么呢?让我们一起来深入了解一下。 一、什么是 FOREIGN KEY 约束&…

计算机毕业设计 招生宣传管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

支付宝远程收款api之小荷包跳转码

想要生成小荷包跳转码的二维码,需要进行以下步骤: 1、开通支付宝小荷包的收款功能权限 2、获取支付宝的小荷包收款码和支付宝账户的UID已经手机号等相应信息(可能会有变动) 3、可能需要一定的代码基础,讲所需信息填…

基于python+控制台+txt文档实现学生成绩管理系统(含课程实训报告)

目录 第一章 需求分析 第二章 系统设计 2.1 系统功能结构 2.1.1 学生信息管理系统的七大模块 2.1.2 系统业务流程 2.2 系统开发必备环境 第三章 主函数设计 3.1 主函数界面运行效果图 3.2 主函数的业务流程 3.3 函数设计 第四章 详细设计及实现 4.1 学生信息录入模块的设计与实…

2024.9.28 作业+思维导图

widget.cpp #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {this->setFixedSize(320,448);this->setWindowFlag(Qt::FramelessWindowHint);//QPushButtonQPushButton *PushButton1 new QPushButton("登录",this);PushButto…

先进封装技术 Part02---TSV科普

一、引言 随着电子设备向更小型化、更高性能的方向发展,传统的芯片互连技术已经无法满足日益增长的需求。在这样的背景下,TSV(Through-Silicon Via,硅通孔)技术应运而生,成为先进封装技术中的核心之一。 如果我们看大多数主板,可以看到两件事:第一,芯片之间的大多数连…

《深度学习》自然语言处理 统计、神经语言模型 结构、推导解析

目录 一、语言转换方法 1、如何将语言转换为模型可以直接识别的内容 1)数据预处理 2)特征提取 3)模型输入 4)模型推理 二、语言模型 1、统计语言模型 1) 案例: • 运行结果: • 稀疏…

AI Agent如何落地?来看看在教育行业大厂的落地实践

大家好,我是Shelly,一个专注于输出AI工具和科技前沿内容的AI应用教练,体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具,拥抱AI时代的到来。 以正教育AI Agent 以正教育大模型AI Agen…

【4.7】图搜索算法-DFS和BFS解根到叶子节点数字之和

一、题目 给定一个二叉树,它的每个结点都存放一个 0-9 的数字, 每条从根到叶子节点的路径都代表一个数字 。 例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。 说明 : 叶子节点是指没有子节点…

CF补题第二天

题1 先来一道最短路热身 题目描述: 思路:第一眼SPFA,结果直接超时,正解思路:每一条边只走一次,那么我们找出不同的连通块,然后拓扑排序求最短路(因为无环),…

有问题未解决(9.28)

#include <stdio.h> int main() {int a 1;int b 2;int c 3;int arr[] { a,b,c };arr[0] 10;printf("%d\n", a);//打印结果为1&#xff1b;return 0; } 颠覆认知了&#xff0c;或许也没有颠覆 arr是一个int类型的数组&#xff0c;他存的就是一个数&…