【Algorithms 4】算法(第4版)学习笔记 09 - 3.2 二叉查找树

文章目录

    • 前言
    • 参考目录
    • 学习笔记
      • 1:二叉树与二叉搜索树定义
      • 1.1:二叉树定义
      • 1.2:二叉搜索树定义
      • 1.3:Java定义
      • 1.4:BST基本实现
      • 1.5:BST demo 演示
      • 1.5.1:节点搜索成功命中演示
      • 1.5.2:节点搜索未命中演示
      • 1.5.3:节点插入演示
      • 1.6:BST 查找:Java 实现
      • 1.7:BST 插入:Java 实现
      • 1.8:树的形状
      • 1.9:BSTs 与快速排序分区的一致性
      • 1.10:小结
      • 2:排序操作
      • 2.1:向上取整与向下取整
      • 2.1.1:向下取整过程演示
      • 2.1.2:向下取整代码实现
      • 2.2:小结
      • 3:删除操作
      • 3.1:删除最大键和删除最小键
      • 3.1.1:删除最小项过程演示
      • 3.1.2:删除最小项代码实现
      • 3.2:删除操作
      • 3.2.1:Hibbard 删除
      • 3.2.2:Hibbard 删除代码实现
      • 3.3:删除操作分析
      • 3.4:小结

前言

本文的主要内容是 二叉搜索树 (binary search trees,以下简称 BST)以及其相关的 API 操作介绍。

参考目录

  • B站 普林斯顿大学《Algorithms》视频课
    (请自行搜索。主要以该视频课顺序来进行笔记整理,课程讲述的教授本人是该书原版作者之一 Robert Sedgewick。)
  • 微信读书《算法(第4版)》
    (本文主要内容来自《3.2 二叉查找树》)
  • 官方网站
    (有书本配套的内容以及代码)

学习笔记

注1:下面引用内容如无注明出处,均是书中摘录。
注2:所有 demo 演示均为视频 PPT demo 截图。

1:二叉树与二叉搜索树定义

定义:BST是对称顺序的二叉树。

1.1:二叉树定义

二叉树要么为空, 要么由两个不相交的二叉树组成(即左子树和右子树)。

进一步理解(有点绕):

  • 一个二叉树可以是一个空树(null)。
  • 否则,它是一个包含一个根节点的树,该节点连接到两个独立的二叉树上,分别称为其左子树和右子树,且左子树和右子树也是二叉树结构。

在这里插入图片描述

二叉树是一种显式数据结构(显式树结构),与之相对应的,堆是一种隐式数据结构(用数组隐式表示树)。

1.2:二叉搜索树定义

对称顺序。每个节点都有一个键(key),并且每个节点的键都满足以下条件:

  • 大于其左子树中所有节点的键。
  • 小于其右子树中所有节点的键。

进一步理解:

  • 对于二叉树中的任意节点,其键值严格大于其左子树中所有节点的键值。
  • 同时,该节点的键值严格小于其右子树中所有节点的键值。

在这里插入图片描述

1.3:Java定义

一个二叉搜索树(BST)是一个指向根节点的引用。

一个节点由四个部分组成:

  • 一个键(Key)和一个对应的值(Value)。
  • 分别指向其左子树(更小的 key)和右子树(更大的 key)的引用。

在这里插入图片描述

1.4:BST基本实现

edu.princeton.cs.algs4.BST

在这里插入图片描述

在这里插入图片描述

1.5:BST demo 演示

查找:如果更小,向左移动;如果更大,向右移动;如果相等,搜索命中。

1.5.1:节点搜索成功命中演示

搜索 H:

初始状态:

在这里插入图片描述

与根节点 S 比较(更小),左移:

在这里插入图片描述


在这里插入图片描述

与节点 S 左子树节点 E 比较(更大),右移:

在这里插入图片描述


在这里插入图片描述

与节点 E 右子树节点 R 比较(更小),左移:

在这里插入图片描述


在这里插入图片描述

与节点 R 左子树节点 H 比较(相等),搜索命中:

在这里插入图片描述

1.5.2:节点搜索未命中演示

搜索 G:

初始状态:

在这里插入图片描述

与根节点 S 比较(更小),左移:

在这里插入图片描述

与节点 S 左子树节点 E 比较(更大),右移:

在这里插入图片描述

与节点 E 右子树节点 R 比较(更小),左移:

在这里插入图片描述

与节点 R 左子树节点 H 比较(更小),左移:

在这里插入图片描述

H 左移为空链接,查找未命中(并返回 null):

在这里插入图片描述

1.5.3:节点插入演示

插入:如果更小,向左移动;如果更大,向右移动;如果为 null,插入。

插入 G:

初始状态:

在这里插入图片描述

移动路径与 #1.5.2 查找类似,直到节点 H 左子树为 null,插入节点 G:

在这里插入图片描述


在这里插入图片描述

G 完整移动路线图:

在这里插入图片描述

1.6:BST 查找:Java 实现

edu.princeton.cs.algs4.BST#get

在这里插入图片描述

开销:

一次结束于给定结点的命中查找所需的比较次数为查找路径的深度加1。

1.7:BST 插入:Java 实现

edu.princeton.cs.algs4.BST#put

在这里插入图片描述

在这里插入图片描述

1.8:树的形状

  • 许多 BSTs 对应同一组keys
  • 一次查找 / 插入所需的比较次数为查找路径的深度加1。

在这里插入图片描述

注:树的形状取决于键被插入的先后顺序。

1.9:BSTs 与快速排序分区的一致性

在这里插入图片描述

命题C。在由N个随机键构造的二叉查找树中,查找命中平均所需的比较次数为~2lnN(约1.39lgN)。

命题D。在由N个随机键构造的二叉查找树中插入操作和查找未命中平均所需的比较次数为~2lnN(约1.39lgN)。

在这里插入图片描述

参考 快速排序:1.4.3:平均案例分析。

1.10:小结

在这里插入图片描述

书里面在章节末尾也有给出相关的表格:

表3.2.2 简单的符号表实现的成本总结
在这里插入图片描述

2:排序操作

Now,we’re going to take a look at ordered symbol table operations using the binary search tree data structure as the underlying implementation.
现在,我们将要探讨如何利用二叉搜索树这一数据结构作为底层实现,来进行有序符号表操作。

相关的所有章节:

  • 3.2.3.1 最大键和最小键 Minimum and maximum.
  • 3.2.3.2 向上取整和向下取整 Floor and ceiling.
  • 3.2.3.3 选择操作 Selection.
  • 3.2.3.4 排名 Rank.

2.1:向上取整与向下取整

2.1.1:向下取整过程演示

在这里插入图片描述
图3.2.10 计算floor()函数

2.1.2:向下取整代码实现

edu.princeton.cs.algs4.BST#floor

在这里插入图片描述

2.2:小结

在这里插入图片描述

3:删除操作

相关的所有章节:

  • 3.2.3.5 删除最大键和删除最小键 Delete the minimum and maximum.
  • 3.2.3.6 删除操作 Delete.
  • 3.2.3.7 范围查找 Range search.
  • 3.2.3.8 性能分析

3.1:删除最大键和删除最小键

3.1.1:删除最小项过程演示

  • 向左移动,直到找到左链接为空的节点。
  • 将该节点替换为其右侧链接。
  • 更新子树计数。

在这里插入图片描述
图3.2.12 删除二叉查找树中的最小结点

3.1.2:删除最小项代码实现

edu.princeton.cs.algs4.BST#deleteMin

在这里插入图片描述

3.2:删除操作

3.2.1:Hibbard 删除

情况一:没有子节点

在这里插入图片描述

情况二:一个子节点

在这里插入图片描述

情况三:两个子节点

在这里插入图片描述

书中关于删除过程操作的描述:

在这里插入图片描述
图3.2.13 二叉查找树中的删除操作

在这里插入图片描述

3.2.2:Hibbard 删除代码实现

edu.princeton.cs.algs4.BST#delete

在这里插入图片描述

在这里插入图片描述

3.3:删除操作分析

在这里插入图片描述

简单汉化一下:

不能令人满意的结果:不对称。
令人惊讶的事实:树不再随机 => 平方操作
长期存在的开放问题:简单高效的 BST 删除。

That’s another one like merging in place, that you’d think there ought to be an easy way to do it, but in 50 years, no one’s really discovered one.
这是另一种类似原地归并的方法,你会认为应该有一种简单的方法可以做到这一点,但 50 年来,没有人真正找到解决方法。

3.4:小结

在这里插入图片描述

下一节:红黑二叉搜索树(Red-black BST):保证所有操作的对数性能。

But the delete operation for Binary Search Trees shows us the kind of complexity that we can encounter with working with these kinds of data structures.
BST 删除操作向我们展示了当遇到类似数据结构时我们可能遇到的复杂情况。

(完)

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

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

相关文章

SpringBoot+WebSocket实现即时通讯(二)

前言 紧接着上文《SpringBootWebSocket实现即时通讯(一)》 本博客姊妹篇 SpringBootWebSocket实现即时通讯(一)SpringBootWebSocket实现即时通讯(二)SpringBootWebSocket实现即时通讯(三&…

第3.1章:StarRocks数据导入——Insert into 同步模式

一、概述 在StarRocks中,insert的语法和mysql等数据库的语法类似,并且每次insert into操作都是一次完整的导入事务。 主要的 insertInto 命令包含以下两种: insert into tbl select ...insert into tbl (col1, col2, ...) values (1, 2, ...…

day02_java基础_变量_数据类型等

零、今日内容 1 HelloWorld程序 2 idea使用 3 变量 4 数据类型 5 String 一、复习 班规班纪。。。。。 安装jdk JDK 是开发工具 JRE 是运行代码 JDK包含JRE 配置环境变量 二、HelloWorld程序 前提:JDK已经安装配置完毕,有了这些环境就敲代码 代码…

Vue路由组件练习

Vue 路由组件练习 1. 演示效果 2. 代码分析 2.1. 安装 vue-router 命令:npm i vue-router 应用插件:Vue.use(VueRouter) 2.2. 创建路由文件 在 src 文件夹下,创建router文件夹,并在该文件夹创建index.js文件 2.3. 导入依赖…

普中51单片机学习(定时器和计数器)

定时器和计数器 51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。51单片机中的定时器/计数器是…

<网络安全>《43 网络攻防专业课<第九课 - 跨站脚本攻击及防范>》

1 什么是XSS XSS(cross site script)或者说跨站脚本是一种Web应用程序的漏洞,恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。 2 XSS脚本实例 …

城市智能交通指挥中心系统方案

二、方案设计 1.简介 公路治安卡口子系统实现对交通流信息的及时采集和各类嫌疑车辆的查控与处置,扼制并打击一些显见性违规违法行为。其主要功能包括:车辆图像记录、速度测定、车辆号牌识别、自动报警、数据检索、流量统计、图像存贮、数据传输和远程…

在前后端分离项目中如何设置统一返回格式

目录 一、步骤一 二、步骤二 在前后端分离的项目中,为了方便前后端交互,后端往往需要给前端返回固定的数据格式,但不同的实体类返回格式不同,所以在真实开发中,我们将所有API接口设置返回统一的格式。基本上包括的有…

【vue3】手动实现md在线编辑

1.背景 由于知识库的一些.md格式的文件的文件内容可能会有变动,如果频繁下载修改后,再进行上传,会让用户操作不方便,为此接入md在线编辑功能 2 md在线编辑具体实现 2.1 搭建项目 搭建项目下载和引入bytemd和fflate相关依赖&…

【深度优先搜索】【树】【状态压缩】2791. 树中可以形成回文的路径数

作者推荐 【深度优先搜索】【树】【有向图】【推荐】685. 冗余连接 II 本文涉及知识点 深度优先搜索 树 图论 状态压缩 LeetCode:2791. 树中可以形成回文的路径数 给你一棵 树(即,一个连通、无向且无环的图),根 节点为 0 &am…

lv15 I2C背景知识(裸机I2C、linux对I2C支持、MPU6050)4

一、I2C总线背景知识 SOC芯片平台的外设分为: 一级外设:外设控制器集成在SOC芯片内部 二级外设:外设控制器由另一块芯片负责,通过一些通讯总线与SOC芯片相连 Inter-Integrated Circuit: 字面意思是用于“集成电路之…

css实现悬浮卡片

结果展示 html代码 <!doctype html> <html lang"zh"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta name"viewport" content"…

Android Studio创建项目时gradle下载慢

先停止当前Sync&#xff0c;找到gradle-wrapper.properties文件&#xff0c;将distributionUrl修改为腾讯镜像源&#xff1a; distributionUrlhttps\://mirrors.cloud.tencent.com/gradle/gradle-6.5-bin.zip

Vue 使用 v-bind 动态绑定 CSS 样式

在 Vue3 中&#xff0c;可以通过 v-bind 动态绑定 CSS 样式。 语法格式&#xff1a; color: v-bind(数据); 基础使用&#xff1a; <template><h3 class"title">我是父组件</h3><button click"state !state">按钮</button&…

【Spring】IoC容器 控制反转 与 DI依赖注入 XML实现版本 第二期

文章目录 基于 XML 配置方式组件管理前置 准备项目一、 组件&#xff08;Bean&#xff09;信息声明配置&#xff08;IoC&#xff09;&#xff1a;1.1 基于无参构造1.2 基于静态 工厂方法实例化1.3 基于非静态 工厂方法实例化 二、 组件&#xff08;Bean&#xff09;依赖注入配置…

C++ bfs 的状态表示(六十二)【第九篇】

今天我们来学习一下bfs的复杂状态表示 1.bfs状态表示 无论是深度优先搜索还是广度优先搜索&#xff0c;搜索的过程均会建立一棵 搜索树&#xff0c;搜索树上的每一个结点都是一个 状态&#xff0c;而搜索的过程又可以看作是 状态的转移。 对于 BFS&#xff0c;搜索过程中产生…

计算机设计大赛 深度学习人体跌倒检测 -yolo 机器视觉 opencv python

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习的人体跌倒检测算法研究与实现 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满…

P6354 [COCI2007-2008#3] TAJNA

题目传送门 题目描述 使用一种加密算法。 设字符串的长度为 n&#xff0c;则构造一个矩阵&#xff0c;使得 rcn 且在 r≤c 的情况下使得 r 尽量大。 然后把给定的明文按照由上到下&#xff0c;从左到右的顺序填充这个 rc 的矩阵。 得到的密文就是把矩阵按照从左到右&#…

内存计算研究进展- 针对图计算的近数据计算架构

针对图计算的近数据计算架构的代表性工作有&#xff1a; Seoul National University的 Tesseract和 Georgia Institute of Technology 的 GraphPIM&#xff0c;具体如下。 1 Tesseract Tesseract是一个针对图计算的可编程的内存计算系统架构&#xff0c;它综合了图计算的特点&…

VMware的三种连接模式

桥接模式 就是将主机网卡与虚拟机虚拟的网卡利用虚拟网桥进行通信。在桥接的作用下&#xff0c;类似于把物理主机虚拟为一个交换机&#xff0c;所有桥接设置的虚拟机连接到这个交换机的一个接口上&#xff0c;物理主机也同样插在这个交换机当中&#xff0c;所以所有桥接下的网…