【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.hqwc.cn/news/479701.html

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

相关文章

Waymo数据集下载与使用

在撰写论文时,接触到一个自动驾驶数据集Waymo Dataset 论文链接为:https://arxiv.org/abs/1912.04838v7 项目链接为:https://github.com/waymo-research/waymo-open-dataset 数据集链接为:https://waymo.com/open waymo提供了两种…

忘记管理员密码

1、在/home/jenkins/config.xml中删除&#xff1a; <useSecurity>true</useSecurity><authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAccess>false</denyAnonymousRea…

【鸿蒙系统学习笔记】状态管理

一、介绍 资料来自官网&#xff1a;文档中心 在声明式UI编程框架中&#xff0c;UI是程序状态的运行结果&#xff0c;用户构建了一个UI模型&#xff0c;其中应用的运行时的状态是参数。当参数改变时&#xff0c;UI作为返回结果&#xff0c;也将进行对应的改变。这些运行时的状…

全面解读视频生成模型Sora

2024年2月15日&#xff0c;OpenAI在其官网发布了《Video generation models as world simulators》的报告&#xff0c;该报告提出了作为世界模拟器的视频生成模型Sora。 OpenAI对Sora介绍如下&#xff1a; We explore large-scale training of generative models on video dat…

[力扣 Hot100]Day30 两两交换链表中的节点

题目描述 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 出处 思路 前两个结点先偷一手用交换val做&#xff0c;从链表第1…

智慧社区管理系统:构建未来的生活模式

在这个信息化、智能化的时代&#xff0c;我们期待的不再是简单的居住空间&#xff0c;而是一个集安全、便捷、舒适、环保于一体的智能化社区。为此&#xff0c;我们推出了全新的智慧社区管理系统&#xff0c;旨在将先进的科技力量引入社区管理&#xff0c;为居民提供更优质的生…

[word] word正反面打印应该怎么设置呢? #知识分享#学习方法#职场发展

word正反面打印应该怎么设置呢&#xff1f; word文档打印时&#xff0c;如果页数比较多&#xff0c;出于格式要求或为了节省纸张&#xff0c;通常需要正反面打印&#xff0c;那怎么操作正反双面打印呢&#xff1f;通常有两种方法打印。 1、选择“打印”对话框底部的“打印”下…

力扣145 二叉树的后序遍历 Java版本

文章目录 题目描述递归解法代码 非递归解法思路代码 题目描述 给你一棵二叉树的根节点 root &#xff0c;返回其节点值的 后序遍历 。 示例 1&#xff1a; 输入&#xff1a;root [1,null,2,3] 输出&#xff1a;[3,2,1] 示例 2&#xff1a; 输入&#xff1a;root [] 输出…

性能测试、负载测试、压力测试、稳定性测试简单区分

是一个总称&#xff0c;可细分为性能测试、负载测试、压力测试、稳定性测试。 性能测试 以系统设计初期规划的性能指标为预期目标&#xff0c;对系统不断施加压力&#xff0c;验证系统在资源可接受范围内&#xff0c;是否能达到性能瓶颈。 关键词提取理解 有性能指标&#…

0成本部署github前端项目流程

0成本部署github纯前端项目流程 对业内来说应该是一个比较常规的操作&#xff0c;对于新手来说进行过一次应该就很难忘记了&#xff0c;但很多人仍然是不会的&#xff0c;认为部署项目很难&#xff0c;很专业&#xff0c;其实现在由于这些厂商的努力&#xff0c;大众&#xff…

羊奶的口味变化会影响质量吗?羊大师为你揭秘

羊奶的口味变化会影响质量吗&#xff1f;羊大师为你揭秘 改变羊奶的口味不一定会对其质量产生影响。尽管口味的改变可能会影响人们对羊奶的喜好程度&#xff0c;但这并不会使羊奶的营养价值降低。 小编羊大师提示&#xff0c;羊奶是一种富含营养的饮品&#xff0c;含有丰富的…

【已解决】PPT无法复制内容怎么办?

想要复制PPT文件里的内容&#xff0c;却发现复制不了&#xff0c;怎么办&#xff1f; 这种情况&#xff0c;一般是PPT文件被设置了以“只读方式”打开&#xff0c;“只读方式”下的PPT无法进行编辑更改&#xff0c;也无法进行复制粘贴的操作。 想要解决这个问题&#xff0c;我…