【面经】查找中常见的树数据结构

news2024/11/15 21:37:52

查找中常见的树数据结构

  • 一、二叉排序(搜索、查找)树(BST,Binary Search Tree)
    • (1)二叉排序树的查找、插入和删除过程
    • (2)叉树排序树的缺陷
    • (3)二叉排序树的改进
  • 二、平衡二叉树(AVL Tree,Balanced binary search tree)
    • (1)平衡二叉树的缺陷
    • (2)平衡二叉树的改进
  • 三、红黑树(自平衡二叉树)(Red-Black Trees)
  • 四、B树(平衡多路查找树)
    • (1)B Tree的缺点
  • 五、B+树
  • 六、B树和B+树的区别


  • 在动态查找中常见的树相关的数据结构包括:
    • 二叉排序(搜索、查找)树(BST,Binary Search Tree),左小右大原则。
    • 平衡二叉树(AVL Tree,Balanced Binary Search Tree),平衡因子不大于1.
    • 红黑树(红黑二叉树)(Red-Black Tree),大致平衡,最长路径长度不大于最短路径长度的两倍。
    • B树(平衡多路查找树),允许一个结点有多个子结点并且每个结点可以存储多个key和data。
    • B+树,所有的data都存储在叶子结点并且使用指针将叶子结点链接起来,便于区间查找。
  • 区别:树的高度不同。树的高度越低,性能越高。这是因为每查找一个节点都是一次I/O
  • 推荐一个数据结构可视化网站 Data Structure Visualizations,是旧金山大学(USFCA)的一个网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

一、二叉排序(搜索、查找)树(BST,Binary Search Tree)

  • 二叉排序树结构默认的就是左小右大的排序原则。
  • 二叉排序树性质:非空左子树的所有键值小于其根结点的键值;非空右子树的所有键值大于其根结点的键值;左右子树都是二叉搜索树。
  • 有这样一个表:
    在这里插入图片描述
  • 按照二叉排序树的方式排序的结果是:
    在这里插入图片描述
  • 对于二叉排序树进行中序遍历,即可得到从小到大的有序序列。它利用了二分的思想,可以快速查找到关键码,查找效率为O(logn)。

(1)二叉排序树的查找、插入和删除过程

  • 查找:
    • 从根节点开始,如果要查找的关键码大于当前关键码,则下一个查找的结点为根节点的右子树,反之则是左子树。 再以新节点为根,重复以上的查找步骤,直到查到得到匹配的关键码为止。
  • 插入:
    • 基于查找操作进行查找合适的位置进行插入。 该合适的位置指的是按照查找步骤进行到的叶子节点处,若欲插入的关键码大于该叶子结点,则插入为右孩子,反之为左孩子。 插入的结点必须是叶子结点。 若开始树空,则直接成为根节点;若欲插入的关键码已存在,则插入失败。 二叉树的构造过程也是不断插入的过程。
  • 删除:
    • 同样是基于查找操作,首先查找到欲删除的结点。此时,删除结点通常包括三种情况
      • ①若删除的结点是叶子结点,则可以直接将结点删去;(0个)
      • ②若删除的结点只有左孩子或者右孩子,则用它的孩子代替它;(1个)
      • ③若删除的结点有左右孩子,则可以寻找其中序遍历的直接前驱(左子树最右边的叶子结点)或者直接后继(右子树最左边的叶子结点)代替它,再删去该直接前驱或直接后继。(2个)

(2)叉树排序树的缺陷

  • 这种普通二叉排序树在数据极端插入的节点集本身就是有序或有一定的顺序的,要么从小到大排列,要么由大到小排列)的情况下,效率较低。比如下面的这个二叉树:
    在这里插入图片描述
  • 在这种极端的情况下。该二叉树就像是一个链表。查找效率下降到了O(n)。查询效率极低。

(3)二叉排序树的改进

  • 插入时要保证二叉树的平衡因子的绝对值不大于1,于是产生了平衡二叉树(AVL树)。
  • 可以参考的博客

二、平衡二叉树(AVL Tree,Balanced binary search tree)

  • 为了避免出现上述一边倒的存储,于是就提出了平衡二叉树
  • 在平衡二叉树中任意结点的两个子树的高度最大差值为1,所以它也被称为高度平衡树增加或删除结点可能需要通过一次或多次树旋转来重新平衡这个树
  • 结点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子-2或2的节点被认为是不平衡的,并需要重新平衡这个树。
  • 比如,我们存储排序好的数据 【3、4、8、12、13、14、16、23】,增加结点如果出现不平衡,则通过节点的左旋或右旋,重新平衡树结构,最终平衡二叉树如下图所示:
    在这里插入图片描述

(1)平衡二叉树的缺陷

  • 如果插入操作比查询操作多, AVL 就要花费大量开销做旋转来调整节点以保证树的平衡。

(2)平衡二叉树的改进

  • 为了减少旋转开销,引入了红黑树。
  • 平衡二叉(AVL)树中的 LL旋转、RR旋转、LR旋转、RL旋转 的详细解释

三、红黑树(自平衡二叉树)(Red-Black Trees)

  • 红黑二叉树(简称:红黑树),它首先是一颗二叉树,同时也是一颗自平衡排序二叉树
  • ② 红黑树在原有的排序二叉树增加了如下几个要求:
    • 每个结点要么红色,要么黑色。
    • 根结点和所有外部结点(NULL 节点、叶节点)的颜色是黑色
    • 每个红色结点的两个子结点都是黑色从每个叶子结点到根结点的路径上不会有两个连续的红色结点)。
    • 从任一结点到其子树中每个叶子结点的路径都包含相同数量的黑色结点。
    • 每次新结点在插入时,颜色是红色的。插入后,会根据红黑树的约束条件进行:树的旋转和颜色的调整。
  • 这些约束强化了红黑树的关键性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。这样就让树大致上是平衡的。
  • ④ 红黑树是一个更高效的检索二叉树,JDK 提供的集合类 TreeMap、TreeSet 本身就是一个红黑树的实现。红黑树的基本操作:插入、删除、左旋、右旋、着色。每插入或者删除一个结点,可能导致树不再符合红黑树的特性,需要进行修复,进行 “左旋、右旋、着色” 操作,使树继续保持红黑树的特性。
    在这里插入图片描述

四、B树(平衡多路查找树)

  • B Tree 中的 B 指的是:Balanced(平衡),B树首先是一个自平衡的。
  • B树相比于前面的各种二叉树,B树允许每个结点可以有更多的子结点并且每个结点中可以存储多个key值。
    在这里插入图片描述
  • 采用B树,B树的高度更低。磁盘IO次数更少。

(1)B Tree的缺点

  • 不适合做区间查找,对于区间查找效率较低。每次都要从根节点开始。所以在 MySQL 中使用了 B+ Trees 来解决这个问题。

五、B+树

  • B+树将数据都存储在叶子节点中。并且叶子节点之间使用指针连接,这样很适合范围查询
  • B+树的非叶子节点上只有索引值,没有数据,所以非叶子节点可以存储更多的索引值,这样让B+树更矮胖,提高检索效率。
    在这里插入图片描述
  • 一文彻底搞懂MySQL基础:B树和B+树的区别

六、B树和B+树的区别

  1. 单个结点只存储key值,不存储数据,所有的数据都存储在叶子结点中,能够存储更多的元素,减少磁盘的IO次数,所以B+树更加适合作为MySQL数据库的底层数据结构。
  2. B+树的叶子结点相互之间有一个链路,形成了一个有序的链表,便于区间查找。

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

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

相关文章

深度学习02-pytorch-04-张量的运算函数

在 PyTorch 中,张量(tensor)运算是核心操作之一,PyTorch 提供了丰富的函数来进行张量运算,包括数学运算、线性代数、索引操作等。以下是常见的张量运算函数及其用途: 1. 基本数学运算 加法运算&#xff1a…

【TypeScript入坑】TypeScript 的复杂类型「Interface 接口、class类、Enum枚举、Generics泛型、类型断言」

TypeScript入坑 Interface 接口简介接口合并TS 强校验Interface 里支持方法的写入class 类应用接口接口之间互相继承接口定义函数interface 与 type 的异同小案例 class 类类的定义与继承类的访问类型构造器 constructor静态属性,Setter 和 Getter做个小案例抽象类 …

Tomcat中BIO和NIO的区别(Tomcat)

BIO Tomcat中BIO的模型和理论很简单,例图如下 1.Acceptor线程死循环阻塞接收客户端的打过来的socket请求 2.接收到请求之后打包成一个SocketProcessor(Runnable),扔到线程池中读取/写入数据 参数配置 1.Acceptor默认线程是1&#…

Day06微信小程序微信登录

微信小程序微信登录 1. 第一:小程序要先发给后端code(只能用一次), 2. 后端要结合数据发给(用get的方式) https://api.weixin.qq.com/sns/jscode2session 数据: appidstring小程序的appIdsecretstring小程序的app…

华为为什么要做三折叠屏手机?

前些天我做了一条视频,关于讲华W的新的三折叠屏手机。我说我有点失望,结果引起了华W的同事的一些关注。于是,华W几位高管都跑过来,跟我解释为什么会出现这样的一个状态。 我才知道,这款手机他们其实是亏着钱在卖的。因…

【大模型实战篇】关于Bert的一些实操回顾以及clip-as-service的介绍

最近在整理之前的一些实践工作,一方面是为了笔记记录,另一方面也是自己做一些温故知新,或许对于理解一些现在大模型工作也有助益。 1. 基于bert模型实现中文语句的embedding编码 首先是基于bert模型实现中文语句的embedding编码,…

使用库函数点亮一个LED灯

软件设计 STM32Gpio的介绍 如果想让LED0点亮,那么R12就要是高电平,LED0就要是低电平,也就是PF9就是低电平 F407系统主频要工作在168MHZ F103的话是工作在72mhz F429的话就180MHZ 接着我们就要使能Gpio的时钟,使能之后对GPIO相关…

ES7 -- ES13

1. ES7 – 2016 1. 数组的includes方法 数组中是否包含某个元素,返回值为boolean let arr [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; arr.includes(5); // true2. ** 幂次方 let res 2 ** 3; // 82. ES8 --2017 1. 字符串补全 基本使用 let str 123;str.padStart…

Django 请求配置

http请求配置 请求流程 urls.py配置 from first_app import viewsurlpatterns [path(admin/, admin.site.urls),path(test/,views.first_test), ] views.py配置 from django.shortcuts import render,HttpResponse# Create your views here. def first_test(request):prin…

Kubernetes 安装网络插件flannel报错Init:ImagePullBackOff,flannel下载镜像报错问题解决

Kubernetes1.28安装网络插件flannel,报错Init:ImagePullBackOff ,flannel安装下载镜像失败 问题 1.安装flannel kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml 2.flannel报错信息 执行查看安装…

Flutter 约束布局

配置插件依赖 设置组件大小 通过属性 childConstraints 实现 分别设置 约束布局一 和 约束布局二 大大小为:160 和 200 点击查看代码文件 class SummaryPageState extends State<SummaryPage1> {ConstraintId constraintId_1 = ConstraintId(ConstraintId_1);Constrain…

【GUI设计】基于Matlab的图像处理GUI系统(1),用matlab实现

博主简介&#xff1a;matlab图像代码项目合作&#xff08;扣扣&#xff1a;3249726188&#xff09; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 本次案例是基于Matlab的图像处理GUI系统&#xff0c;用matlab实现。 本次内容主要分为两部分&a…

专题七_分治_快排_归并_算法专题详细总结

目录 分治 一、分治思想的概念 二、分治思想的步骤 1. 颜⾊分类&#xff08;medium&#xff09; 解析&#xff1a; 2. 快速排序&#xff08;medium&#xff09; 解析&#xff1a; 总结&#xff1a; 3. 快速选择算法&#xff08;medium&#xff09; 解析&#xff1a; …

【BurpSuite】Cross-site scripting (XSS 学徒部分:1-9)

&#x1f3d8;️个人主页&#xff1a; 点燃银河尽头的篝火(●’◡’●) 如果文章有帮到你的话记得点赞&#x1f44d;收藏&#x1f497;支持一下哦 【BurpSuite】Cross-site scripting (XSS 学徒部分:1-9&#xff09; 实验一 Lab: Reflected XSS into HTML context with nothing…

maven手动导入本地仓库

maven手动导入本地仓库 1.在maven仓库下载对应的依赖 一定要把jar包下载到maven仓库的bin下 2.找到自己仓库的maven仓库下的bin目录cmd进去 在cmd窗口中输入以下命令&#xff1a;&#xff08;这里根据你的groupId、artifactId、version修改即可&#xff09; <!-- https:…

乱弹篇(53)丹桂未飘香

今天是2024年“秋分”节气&#xff0c;也是第7个中国“农民丰收节”&#xff0c;本“人民体验官”推广人民日报官方微博文化产品《文化中国行看丰收之美》。 截图&#xff1a;来源“人民体验官”推广平台 人民微博说&#xff1a;“春华秋实&#xff0c;岁物丰成。”又说&#…

dhtmlxGantt 甘特图 一行展示多条任务类型

效果如图: 后台拿到数据 处理之后如图: 含义: 如上图所示, 如果一行需要展示多个 需要给父数据的那条添加render:split属性, 子数据的parent为父数据的Id即可 切记 父数据的id 别为0 为0 时 会出现错乱 因为有些小伙伴提出分段展示的数据结构还是有点问题,下面展示一个完整…

机器人时代的“触觉革命”:一块小传感器如何颠覆你的认知?

你是否曾经想过,机器人也能像人类一样有“触觉”?不再是简单的机械操作,而是具备真正的感知能力,能够学会精细的任务。今天我想和你聊聊一种让机器人“长出触觉”的技术:一种小巧的触觉传感器,它的名字叫“AnySkin”。别看它小,它的潜力可一点都不小,或许能彻底改变我们…

Windows下如何定时执行自定义任务

目录 一.前言二.设置定时自动执行自定义任务 一.前言 本文环境是Windows11系统。 有时候我们希望能够在Windows下定时自动执行自定义任务&#xff0c;比如检测数据库服务的状态。那在Windows下怎么定时自动执行自定义任务&#xff0c;这篇文章介绍一种方法。 二.设置定时自动…

NLP 主流应用方向

主流应用 文本分类文本匹配序列标注生成式任务 应用细分 文本纠错话者分离 本质为文本分类任务数字归一化 实现数字映射&#xff0c;提高内容可读性 如将一九九九转1999