JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?(上)

简介: JavaScript 数据结构与算法之美 - 非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?(上)

1. 前言


想学好前端,先练好内功,内功不行,就算招式练的再花哨,终究成不了高手。

非线性表(树、堆),可以说是前端程序员的内功,要知其然,知其所以然。


笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。


非线性表中的树、堆是干嘛用的 ?其数据结构是怎样的 ?


希望大家带着这两个问题阅读下文。


2. 树


微信图片_20220513105643.png


的数据结构就像我们生活中的真实的树,只不过是倒过来的形状。


术语定义


  • 节点:树中的每个元素称为节点,如 A、B、C、D、E、F、G、H、I、J。
  • 父节点:指向子节点的节点,如 A。
  • 子节点:被父节点指向的节点,如 A 的孩子 B、C、D。
  • 父子关系:相邻两节点的连线,称为父子关系,如 A 与 B,C 与 H,D 与 J。
  • 根节点:没有父节点的节点,如 A。
  • 叶子节点:没有子节点的节点,如 E、F、G、H、I、J。
  • 兄弟节点:具有相同父节点的多个节点称为兄弟节点,如 B、C、D。
  • 节点的高度:节点到叶子节点的最长路径所包含的边数。
  • 节点的深度:根节点到节点的路径所包含的边数。
  • 节点层数:节点的深度 +1(根节点的层数是 1 )。
  • 树的高度:等于根节点的高度。
  • 森林: n 棵互不相交的树的集合。


微信图片_20220513105700.png


高度是从下往上度量,比如一个人的身高 180cm ,起点就是从 0 开始的。


深度是从上往下度量,比如泳池的深度 180cm ,起点也是从 0 开始的。


高度和深度是带有字的,都是从 0 开始计数的。


而层数的计算,是和我们平时的楼层的计算是一样的,最底下那层是第 1 层,是从 1 开始计数的,所以根节点位于第 1 层,其他子节点依次加 1。


二叉树分类


微信图片_20220513105721.png


二叉树


  • 每个节点最多只有 2 个子节点的树,这两个节点分别是左子节点和右子节点。如上图中的 1、 2、3。


不过,二叉树并不要求每个节点都有两个子节点,有的节点只有左子节点,有的节点只有右子节点。以此类推,自己想四叉树、八叉树的结构图。


满二叉树


  • 一种特殊的二叉树,除了叶子节点外,每个节点都有左右两个子节点,这种二叉树叫做满二叉树。如上图中的 2。

完全二叉树


  • 一种特殊的二叉树,叶子节点都在最底下两层,最后一层叶子节都靠排列,并且除了最后一层,其他层的节点个数都要达到最大,这种二叉树叫做完全二叉树。如上图的 3。


完全二叉树与不是完全二叉树的区分比较难,所以对比下图看看。


微信图片_20220513105743.png



之前的文章 栈内存与堆内存 、浅拷贝与深拷贝 中有说到:JavaScript 中的引用类型(如对象、数组、函数等)是保存在堆内存中的对象,值大小不固定,栈内存中存放的该对象的访问地址指向堆内存中的对象,JavaScript 不允许直接访问堆内存中的位置,因此操作对象时,实际操作对象的引用。


那么到底是什么呢 ?其数据结构又是怎样的呢 ?


堆其实是一种特殊的树。只要满足这两点,它就是一个堆。


  • 堆是一个完全二叉树。


完全二叉树:除了最后一层,其他层的节点个数都是满的,最后一层的节点都靠左排列。


  • 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值。

也可以说:堆中每个节点的值都大于等于(或者小于等于)其左右子节点的值。这两种表述是等价的。


对于每个节点的值都大于等于子树中每个节点值的堆,我们叫作大顶堆。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫作小顶堆


微信图片_20220513105816.png


其中图 1 和 图 2 是大顶堆,图 3 是小顶堆,图 4 不是堆。除此之外,从图中还可以看出来,对于同一组数据,我们可以构建多种不同形态的堆。


二叉查找树(Binary Search Tree)


  • 一种特殊的二叉树,相对较小的值保存在左节点中,较大的值保存在右节点中,叫二叉查找树,也叫二叉搜索树。


二叉查找树是一种有序的树,所以支持快速查找、快速插入、删除一个数据。

下图中, 3 个都是二叉查找树,


微信图片_20220513105835.png


平衡二叉查找树


  • 平衡二叉查找树:二叉树中任意一个节点的左右子树的高度相差不能大于 1

从这个定义来看,完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。


平衡二叉查找树中平衡的意思,其实就是让整棵树左右看起来比较对称、比较平衡,不要出现左子树很高、右子树很矮的情况。这样就能让整棵树的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些。


平衡二叉查找树其实有很多,比如,Splay Tree(伸展树)、Treap(树堆)等,但是我们提到平衡二叉查找树,听到的基本都是红黑树。


微信图片_20220513105851.png


红黑树(Red-Black Tree)


红黑树中的节点,一类被标记为黑色,一类被标记为红色。除此之外,一棵红黑树还需要满足这样几个要求:


  • 根节点是黑色的。
  • 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据。
  • 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的。
  • 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点。

下面两个都是红黑树。


微信图片_20220513105905.png


存储


完全二叉树的存储


  • 链式存储


每个节点由 3 个字段,其中一个存储数据,另外两个是指向左右子节点的指针。

我们只要拎住根节点,就可以通过左右子节点的指针,把整棵树都串起来。

这种存储方式比较常用,大部分二叉树代码都是通过这种方式实现的。


微信图片_20220513105919.png


  • 顺序存储


用数组来存储,对于完全二叉树,如果节点 X 存储在数组中的下标为 i ,那么它的左子节点的存储下标为 2 i ,右子节点的下标为 2 i + 1,反过来,下标 i / 2 位置存储的就是该节点的父节点。


注意,根节点存储在下标为 1 的位置。完全二叉树用数组来存储是最省内存的方式。


微信图片_20220513105940.png

相关文章
|
11月前
|
存储 监控 算法
局域网监控其他电脑的设备信息管理 Node.js 跳表算法
跳表通过分层索引实现O(logn)的高效查询、插入与删除,适配局域网监控中设备动态接入、IP映射及范围筛选等需求,相比传统结构更高效稳定,适用于Node.js环境下的实时设备管理。
406 9
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
411 0
|
11月前
|
存储 监控 JavaScript
企业上网监控系统的恶意 URL 过滤 Node.js 布隆过滤器算法
布隆过滤器以低内存、高效率特性,解决企业上网监控系统对百万级恶意URL实时检测与动态更新的难题,通过概率性判断实现毫秒级过滤,内存占用降低96%,适配大规模场景需求。
547 3
|
11月前
|
存储 监控 算法
电脑管控软件的进程优先级调度:Node.js 红黑树算法
红黑树凭借O(log n)高效插入、删除与查询特性,适配电脑管控软件对进程优先级动态调度的高并发需求。其自平衡机制保障系统稳定,低内存占用满足轻量化部署,显著优于传统数组或链表方案,是实现关键进程资源优先分配的理想选择。
489 1
|
11月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
447 4
|
12月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
615 3
|
Web App开发 数据采集 JavaScript
动态网页爬取:Python如何获取JS加载的数据?
动态网页爬取:Python如何获取JS加载的数据?
2011 58
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
370 2
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
366 17

热门文章

最新文章