25考研数据结构复习·7.3树形查找

news2024/9/27 5:55:18

目录

二叉排序树

平衡二叉树

平衡二叉树的删除

红黑树

红黑树的插入

红黑树的删除


二叉排序树

  1. 二叉排序树的定义
    1. 👩‍💻 左子树结点值 < 根节点值 < 右子树结点值
    2. 默认不允许两个结点的关键字相同
  2. 查找操作
    1. 从根节点开始,目标值更小往左找,目标值更大往右找
  3. 插入操作
    1. 找到应该插入的位置(一定是叶子节点),一定要注意修改其父节点指针
  4. 👩‍💻 删除操作
    1. 被删结点为叶子节点,直接删除
    2. 被删结点只有左或只有右子树,用其字数顶替其位置
    3. 被删结点由左、右子树
      1. 可用其后继节点顶替,再删除后继节点
      2. 或用其前驱节点顶替,再删除前驱节点
      3. 前驱:左子树中最有下的结点
      4. 后继:右子树中最左下的结点
  5. 查找效率分析
    1. 取决于树的高度,最好O(logn),最坏O(n)
    2. 👩‍💻 平均查找长度的计算
      1. 查找成功的情况
      2. 查找失败的情况(需补充失败节点)

平衡二叉树

  1. 定义
    1. 树上任一结点的左子树和右子树的高度之差不超过1
    2. 结点的平衡因子 = 左子树高 - 右子树高
  2. 插入操作
    1. 和二叉排序树一样,找合适的位置插入
    2. 新插入的结点可能导致其祖先们平衡因子改变导致失衡
  3. 👩‍💻 调整“不平衡”
    1. 找到最小不平衡子树进行调整,记最小不平衡子树的根为A
    2. LL:在A的左孩子的左子树插入导致A不平衡,将A的左孩子右上旋
    3. RR:在A的右孩子的右子树插入导致A不平衡,将A的右孩子左上旋
    4. LR:在A的左孩子的右子树插入导致A不平衡,将A的左孩子的右孩子,先左上旋再右上旋
    5. RL:在A的右孩子的左子树插入导致A不平衡,将A的右孩子的左孩子,先右上旋再左上旋
  4. 查找效率分析
    1. 👩‍💻 高为h的平衡二叉树最少有几个结点——递推求解

      假设以nh表示深度为h的平衡树中含有的最少结点数,则有n0=0,n1=1,n2=2,并且有n_h=n_{h-1}+n_{h-2}+1

    2. 平衡二叉树最大深度为O(logn),平均查找长度/查找的时间复杂度为O(logn)

平衡二叉树的删除

具体步骤

  1. 删除结点(方法同“二叉排序树”)
    1. 若删除的结点是叶子,直接删
    2. 若删除的结点只有一个子树,用字数顶替删除位置
    3. 若删除的结点有两棵子树,用前驱(或后继)结点顶替,并转化为对前驱(或后继)结点的删除
  2. 从被删除结点向上回溯,找到最小不平衡子树。找不到就结束。
  3. 找到最小不平衡子树z下,y是结点z的高度最高的孩子节点,x是结点y的高度最高的孩子节点。
  4. 然后对以z为根的子树进行平衡调整(LL/RR/LR/RL)
  5. 如果不平衡向上传到,继续2
    1. 对最小不平衡子树的旋转可能导致树变矮,从而导致上层祖先不平衡(不平衡向上传递)

平衡二叉树删除操作时间复杂度=O(log2n)

红黑树

红黑树和平衡二叉树在查找、插入、删除的时间复杂度都是O(log2n)。但使用场景不同,

平衡二叉树:适用于以查为主、很少插入/删除的场景;

红黑树:适用于频繁插入、删除的场景,实用性更强。

 推荐一个“帮手快乐”网站:Red/Black Tree Visualization (usfca.edu)icon-default.png?t=N7T8https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

  1. 红黑树是二叉排序树
  2. 黑高——一个结点的“黑高”从某结点出发(不含该结点)到达任一空姐点的路径上黑节点总数
  3. 定义
    1. 每个结点都是红色,或者是黑色的
    2. 根节点是黑色的
    3. 叶节点(NULL结点、外部结点)均是黑色的
    4. 不存在两个相邻的红节点(即红节点的父节点和孩子节点均是黑色)
    5. 对每个结点,从该节点到任一叶节点的简单路径上,所含黑结点的数目相同
  4. 性质:
    1. 从根节点到叶节点的最长路径不大于最短路径的2倍
    2. 从n个内部结点的红黑树高度h≤2log2(n+1)

红黑树的插入

  1. 先查找,确定插入位置(原理同二叉排序树),插入新结点
  2. 新结点是——染为黑色
  3. 新结点非根——染为红色 (保证对每个结点,从该节点到任一叶节点的简单路径上,所含黑结点的数目相同)
    1. 若插入新结点后依然满足红黑树定义,则插入结束
    2. 若插入新结点后不满足红黑树定义,需要调整(看新结点叔叔的脸色),使其重新满足红黑树定义
      1. 旋转+染色
        1. LL型:右单旋,父换爷+染色
        2. RR型:左单旋,父换爷+染色
        3. LR型:左、右双旋,儿换爷+染色
        4. RL型:右、左双旋,儿换爷+染色
      2. 染色+变新
        1. 叔父爷染色,爷变为新节点

红黑树的删除

  1. 时间复杂度=O(log2n)
  2. 删除结点的处理方式和“二叉排序树的删除”一样
  3. 按2处理后,可能破坏“红黑树特性”,此时需要调整结点颜色、位置,使其再次满足“红黑树特性”

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

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

相关文章

用 VS Code 开发 uni-app 项目

文章目录 1.为什么选择 VS Code &#xff1f;2.安装相关插件2.1 安装uni-app插件2.2 安装ts类型检验 3.在微信小程序中运行 1.为什么选择 VS Code &#xff1f; ⚫ HbuilderX 对 TS 类型支持暂不完善 ⚫ VS Code 对 TS 类型支持友好&#xff0c;同时VS Code 也是我们熟悉的编辑…

移远通信LTE-A模组EM060K-GL成为ChromeOS准入供应商

近日&#xff0c;全球领先的物联网整体解决方案移远通信宣布&#xff0c;其先进的LTE-A模组EM060K-GL已进入谷歌Chrome OS准入供应商名录&#xff0c;后续将作为候选模组用于搭载Chrome OS系统的笔记本电脑中&#xff0c;为其提供“始终在线”的网络连接体验。这一重要里程碑彰…

禾川Q1系列PLC通过ModbusRtu控制E600变频器

一、新建CodeSys工程项目 新建工程可以选择【File】→【New Project】,也可以直接选择【New Project】两种方式 用户可以选择需要的项目类型,命名项目工程以及存储路径,完成后选择【OK】 选择连接设备【HCQ1-1300-D】(在此之前PC已经安装Q1安装包),选择编程语言,教程示例…

Node.js(4)——模块化

什么是模块化&#xff1f; ComminJS模块是为Node.js打包JavaScript代码的原始方式。Node.js还支持浏览器和其他JavaScript运行时使用的ECMAScript标准。在Node.js中&#xff0c;每个文件都被视为一个单独的模块。 CommonJS标准 使用&#xff1a; 导出&#xff1a;moudule.exp…

一六零、云服务器开发机配置zsh

切换shell 在Linux中默认使用/bin/bash&#xff0c;在用户创建时&#xff0c;会自动给用户创建用户默认的shell。默认的shell就是/bin/bash。要修改shell将其设置为/bin/ksh&#xff0c;有两种方法方法 # 方法一: chsh -s /bin/ksh chsh -s /bin/zsh # 方法二: usermod -s /b…

基于CIFAR10的图片识别

前言 这个算是重拾一个古早项目了&#xff0c;当时搭建神经网络对CIFAR10数据集进行训练以后&#xff0c;对训练好的网络进行了验证&#xff0c;可以参考这笔者的两篇博客&#xff1a; pytorch 模型训练&#xff08;以CIFAR10数据集为例&#xff09;_pytorch cifar10-CSDN博客…

CAPL使用结构体的方式组装一条DoIP车辆声明消息(方法2)

在文章CAPL使用结构体的方式组装一条DoIP车辆声明消息(方法1)中,我们声明一个结构体DoIPMessage表示完整的DoIP车辆声明消息: 上半部分是DoIP报头通用部分(也就是所有类型的DoIP消息都有的),而payload是每个类型的DoIP消息独有的部分,对于车辆声明消息来说,用另一个结…

Golang | Leetcode Golang题解之第309题买卖股票的最佳时机含冷冻期

题目&#xff1a; 题解&#xff1a; func maxProfit(prices []int) int {if len(prices) 0 {return 0}n : len(prices)f0, f1, f2 : -prices[0], 0, 0for i : 1; i < n; i {newf0 : max(f0, f2 - prices[i])newf1 : f0 prices[i]newf2 : max(f1, f2)f0, f1, f2 newf0, n…

【划分字母区间】python刷题记录

R3-贪心篇. 思路&#xff1a; 1.使用dict记录S中每个字符出现的最后位置 2.从s[0]开始&#xff0c;j该元素的dict值&#xff0c;遍历s&#xff0c;如果出现s[i]>j&#xff0c;就需要更新j的值 3.i到j了&#xff0c;那就下一段 class Solution:def partitionLabels(self,…

「Unity3D」自动布局LayoutElement、ContentSizeFitter、AspectRatioFitter、GridLayoutGroup

布局元素与布局控制器 布局元素实现ILayoutElement接口&#xff0c;布局控制器实现ILayoutController接口&#xff0c;后者根据前者的属性控制具体布局——有些布局控制器也是布局元素&#xff0c;即同时实现这两个接口&#xff0c;如LayoutGroup。 public interface ILayout…

【原创教程】电气电工:电烙铁的使用方法(入门)

今天我们深入了解电烙铁的相关知识及其应用。电烙铁作为电气电工行业中的重要工具&#xff0c;它在焊接和电路维修等方面扮演着不可或缺的角色。接下来&#xff0c;我们将一起探索电烙铁的奥秘。 一、电烙铁概述 电烙铁是一种通过电能转化为热能进行焊接的工具。它具有体积小…

jenkins服务器重启,构建记录消失

1、进入系统管理查看系统运行日志&#xff0c;发现报保存构建日志失败 jenkins module java.base does not "opens java.lang.ref" to unnamed module 5276d6ee Java平台模块系统对类的可见性和访问权限进行了严格的控制。在Java 9及以上版本中&#xff0c;java.la…

武汉流星汇聚:深耕跨境电商,万企信赖之选,共绘全球贸易新蓝图

在全球化浪潮汹涌的今天&#xff0c;跨境电商作为连接世界经济的桥梁&#xff0c;正以前所未有的速度改变着国际贸易的格局。在这场充满机遇的旅途中&#xff0c;武汉流星汇聚电子商务有限公司犹如一颗璀璨的流星&#xff0c;划破长空&#xff0c;以其卓越的实力和不懈的努力&a…

JetBrains:XML tag has empty body警告

在xml文件中配置时&#xff0c;因为标签内容为空&#xff0c;出现黄色警告影响观感。 通过IDE配置关闭告警

编程语言|Python——为什么0.1+0.2≠0.3(深入理解Python中的浮点数运算)

一、问题描述 技术面的时候被问到一个python问题,即当我们输入0.1+0.2时,打印出来的却不是0.3,而是0.30000000000000004,为什么? 其实不仅是Python,很多编程语言例如C、Java、JavaScript等等都有这种特性。原理很简单,所有数的运算在计算机中都是进行二进制计算的,十进…

RS485 转 Lora 模块

一、功能概述 本产品是一款无线中继器&#xff0c;将 RS485 信号转为无线信号&#xff0c;通过 无线方式远传&#xff0c;实现远程通信功能。采用 Lora无线通信技术&#xff0c;工作 中心频率 433M &#xff0c;空旷传输距离 7000 米。 二、接线、配置方法、指示灯状态 1 、…

【Python实战因果推断】63_随机实验与统计知识5

目录 Hypothesis Testing Null Hypothesis Hypothesis Testing 另一种引入不确定性的方法是陈述假设检验&#xff1a;两个组之间的均值差异是否在统计上与零&#xff08;或其他任何值&#xff09;不同&#xff1f;要回答这类问题&#xff0c;你需要回想正态分布的和或差也是正…

【Java算法专场】前缀和(上)

前言 在求数组或者矩阵求和等问题&#xff0c;我们如果采用暴力解法&#xff0c;时间复杂度可能会达到O(n)或者更高&#xff0c;因此&#xff0c;我们可利用前缀和来解决。 前缀和 前缀和是指序列中的n项和&#xff0c;相当于数学问题中秋数列的前n项和。主要用于数组或列表中…

[Bugku] web-CTF-POST

1.开启环境 2.根据题目得知使用POST传参&#xff0c;即可得到flag

[240802] 有关 Homebrew 的安全审核 | Running C++ anywhere like a script

目录 有关 Homebrew 的安全审核Running C anywhere like a script 有关 Homebrew 的安全审核 Trail of Bits 对 macOS 包管理工具 Homebrew 进行了安全审计&#xff0c;重点关注其核心代码库和 CI/CD 流程。审计发现了 Homebrew 中存在的一些问题&#xff0c;这些问题可能被攻…