返回顶部
首页 > 资讯 > 前端开发 > JavaScript >如何通过代码实现二叉搜索树
  • 583
分享到

如何通过代码实现二叉搜索树

2024-04-02 19:04:59 583人浏览 独家记忆
摘要

本篇内容主要讲解“如何通过代码实现二叉搜索树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过代码实现二叉搜索树”吧!首先,二叉搜索树到底是什么?二叉搜索树

本篇内容主要讲解“如何通过代码实现二叉搜索树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过代码实现二叉搜索树”吧!

首先,二叉搜索树到底是什么?

二叉搜索树(BST)是一种特殊类型的树形数据结构,由节点及其子节点组成,子节点也被视作“后代”,可以把它想象成一棵倒置的树或者是树的根部。

如何通过代码实现二叉搜索树

每个节点最多只能有2个子节点:左节点和右节点。为了使它成为一个有效的二叉搜索树,左节点的值必须总是小于母节点,而右节点的值必须总是大于母节点。没有任何间隙的BST,即每个节点都有一个左节点和一个右节点的二叉搜索树,被称为“完美”树。

在完美树中,当遍历树时,每个级别中的节点数会翻倍,将前面的所有节点相加并在该数字上再添加“1”可以得出底层的节点总数。

如何通过代码实现二叉搜索树

当在平衡二叉搜索树中搜索一个元素时,平均需要花费额的时间为O(log  n),在最坏的情况下,需要O(n)。你可以把在二叉搜索树中的搜索看作是“选择你自己的冒险”模型,从顶部节点开始,然后沿着树向下,在到达的每个节点问同样的2个问题。

  • 我要找的值是否小于当前节点?如果是,向左走。

  • 我要找的值是否大于当前节点?如果是,向右走。

插入和删除也非常快,平均花费O(log n)的时间。但有一个缺点就是不能像数组那样获得随机元素。

什么时候可以使用二叉搜索树?

假设你需要为Facebook这样的社交媒体应用程序设计一个数据库。该数据库需要处理数百万个用户名,并且需要在登录期间快速检索到其中一个用户名。由于每天都有新注册或删除的账户,你也需要方便进行插入和删除的操作。

通过一个排序过的数组进行二分搜索会非常快(需要花费O(log  n)时间),但是插入或删除一个用户名会导致整个数组重新排序,需要花费O(n)时间,这取决于数组的大小,可能会相对慢一些。如果我们使用二叉搜索树,插入或删除的时间会快得多(花费O(log  n)时间)。

如何通过代码实现二叉搜索树

如果有一个带有名字的二叉搜索树(比如这个《海底总动员》的树),就可以按字母顺序排列。

在字母表中,Dory在Marlin之前,所以它是左边的节点,而Moonfish在Marlin之后,所以它是右边的节点。同样地,在下一层搜索也遵循这个规律。Bruce在Crush之前,也在Dory和Marlin之前。Darla在Crush之后,但在Dory和Marlin之前。

现在准备好,是时候寻找Nemo了!

寻找Nemo!

假设已经有一个有效的二叉搜索树,并且需要找到Nemo。因为我们知道树中的节点是按字母顺序排序的,所以这应该相当简单。

从Marlin开始,左边是Dory,右边是Moonfish。我们知道Nemo在字母表中位于Marlin之后,所以我们将遍历到正确的节点(Moonfish)。Nemo按字母顺序是排在Moonfish之后的,所以继续往下看Moonfish的右子节点。很幸运,那是…Nemo!找到Nemo了!

如何通过代码实现二叉搜索树

效率很高。二叉搜索树减少了整个搜索过程的时间复杂性!如果树没有分类,只是一个普通的树形结构呢?或者要证实这是个二叉搜索树呢?目前有两种不同的搜索技术可以实现这一点。

什么是广度优先搜索?

广度优先搜索是一种在树(或图形)中一次遍历一级的方法,每次都从左到右在节点之间移动。

在《海底总动员》的例子中,Marlin首先会问Dory,“你知道我儿子Nemo在哪里吗?”如果它说不,Marlin就会问Moonfish同样的问题。如果它也说不,Marlin会再下一层,问Crush、Gill和Mr.  Ray,然后Marlin就找到Nemo了!

如何通过代码实现二叉搜索树

广度优先搜索

如果在Mr.  Ray之后没有找到Nemo,Marlin会到下一级询问Bruce和Darla等等。使用广度优先搜索可以找到起始节点(Marlin)和目标节点(Nemo)之间的最短距离。时间复杂度是O(n),因为在最坏的情况下,需要检查每个节点才能找到Nemo。

什么是深度优先搜索?

深度优先搜索(Depth first  search)是一种从顶部节点一直向下遍历到其最远子节点的树(或图形)的方法,然后在未找到目标节点时再回去并尝试其他路径。

在《海底总动员》的例子中,Marlin首先会问Dory “你知道Nemo在哪里吗?”  如果她不知道,他就会问Crush同样的问题,因为Crush是Dory最左边的子节点。如果Crush也说没有,Marlin将移动到下一级去问Bruce,尽管他害怕成为鲨鱼的点心,但也会问问他有没有见到自己的儿子。

如何通过代码实现二叉搜索树

深度优先搜索

如果Bruce说没看到Nemo,并向Marlin保证“鱼是朋友,不是食物”,Marlin就需要回到上级,寻找另一个他还没有问到的节点。回到Crush那里,他会发现下一步应该问Darla。由于Crush的所有后代现在都被审问过了,Marlin会回到Dory那里,检查她其余的“后代”。Marlin需要把每个角色询问一遍后才能找到Nemo。

如何通过代码实现二叉搜索树

深度优先搜索顺序

与广度优先搜索一样,深度优先搜索也包括时间复杂度O(n),但空间复杂度可能有所不同。深度优先搜索通常占用较少的内存或空间,假设可以在遍历整个树之前找到目标节点。

由于二叉搜索树中的每增加一级节点会加倍(至少对于平衡树而言),如果丢失的节点(Nemo)位于树的较低位置,则可以使用深度优先搜索来节省内存。在最坏的情况下,两种方法的空间复杂度都是O(n)。

关于二叉搜索树以及如何通过代码实现它们还有很多需要学习,但这个有趣的案例会成为你了解数据结构的起点。

到此,相信大家对“如何通过代码实现二叉搜索树”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 如何通过代码实现二叉搜索树

本文链接: https://lsjlt.com/news/84515.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 如何通过代码实现二叉搜索树
    本篇内容主要讲解“如何通过代码实现二叉搜索树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何通过代码实现二叉搜索树”吧!首先,二叉搜索树到底是什么二叉搜索树(...
    99+
    2024-04-02
  • C++实现验证二叉搜索树代码
    本篇内容主要讲解“C++实现验证二叉搜索树代码”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++实现验证二叉搜索树代码”吧!验证二叉搜索树Given a binary tree, determ...
    99+
    2023-06-20
  • Python实现二叉搜索树
    二叉搜索树 我们已经知道了在一个集合中获取键值对的两种不同的方法。回忆一下这些集合是如何实现ADT(抽象数据类型)MAP的。我们讨论两种ADT MAP的实现方式,基于列表的二分查找和哈希表。在这一节中,我...
    99+
    2022-06-04
    Python
  • 如何利用JavaScript实现二叉搜索树
    计算机科学中最常用和讨论最多的数据结构之一是二叉搜索树。这通常是引入的第一个具有非线性插入算法的数据结构。二叉搜索树类似于双链表,每个节点包含一些数据,以及两个指向其他节点的指针;它...
    99+
    2024-04-02
  • C++如何实现验证二叉搜索树
    本文小编为大家详细介绍“C++如何实现验证二叉搜索树”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++如何实现验证二叉搜索树”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。验证二叉搜索树Example 1:In...
    99+
    2023-06-19
  • 何为二叉搜索树
    本篇内容主要讲解“何为二叉搜索树”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“何为二叉搜索树”吧!什么是树树是一种数据结构,它是由n(n>=1)个有限结点...
    99+
    2024-04-02
  • C++实现LeetCode(173.二叉搜索树迭代器)
    [LeetCode] 173.Binary Search Tree Iterator 二叉搜索树迭代器 Implement an iterator over a binary sea...
    99+
    2024-04-02
  • 利用java实现二叉搜索树
    目录二叉搜索树的定义实现一颗二叉搜索树二叉搜索树的定义类二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树的定义 它是一颗二叉树 任一节点的左子树上的所有节...
    99+
    2024-04-02
  • C++如何实现LeetCode之复原二叉搜索树
    这篇文章给大家分享的是有关C++如何实现LeetCode之复原二叉搜索树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。[LeetCode] 99. Recover Binary Search Tree 复原二叉搜...
    99+
    2023-06-20
  • C++二叉搜索树BSTree如何使用
    这篇文章主要介绍“C++二叉搜索树BSTree如何使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++二叉搜索树BSTree如何使用”文章能帮助大家解决问题。一、概念二叉搜索树又称二叉排序树,它...
    99+
    2023-07-05
  • C++实现LeetCode(98.验证二叉搜索树)
    [LeetCode] 98. Validate Binary Search Tree 验证二叉搜索树 Given a binary tree, determine if it is ...
    99+
    2024-04-02
  • C++实现LeetCode(99.复原二叉搜索树)
    [LeetCode] 99. Recover Binary Search Tree 复原二叉搜索树 Two elements of a binary search tree (BST...
    99+
    2024-04-02
  • 怎么利用JavaScript实现二叉搜索树
    这篇文章给大家分享的是有关怎么利用JavaScript实现二叉搜索树的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。计算机科学中最常用和讨论最多的数据结构之一是二叉搜索树。这通常是引入的第一个具有非线性插入算法的数...
    99+
    2023-06-14
  • 在Java中实现二叉搜索树的全过程记录
    目录二叉搜索树有序符号表的 API实现二叉搜索树二叉搜索树类查找插入最小/大的键小于等于 key 的最大键/大于等于 key 的最小键根据排名获得键根据键获取排名删除总结二叉搜索树 ...
    99+
    2024-04-02
  • C++二叉搜索树实例分析
    本篇内容介绍了“C++二叉搜索树实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!独一无二的二叉搜索树Given an integer&...
    99+
    2023-06-19
  • 如何在Java中操作二叉搜索树
    如何在Java中操作二叉搜索树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一、二叉搜索树插入元素     class&n...
    99+
    2023-06-15
  • 【C++】平衡二叉搜索树的模拟实现
    🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。 ...
    99+
    2023-09-11
    c++ 开发语言
  • python实现二叉搜索树的四种方法
    目录树的介绍二叉搜索树列举几种Python中几种常见的实现方式:1.使用类和递归函数实现2.使用列表实现3.使用字典实现4.使用堆栈实现树的介绍 树不同于链表或哈希表,是一种非线性数...
    99+
    2023-05-15
    python 二叉搜索树
  • C++实现LeetCode(96.独一无二的二叉搜索树)
    [LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树 Given n, how many structurally un...
    99+
    2024-04-02
  • C语言实例实现二叉搜索树详解
    目录有些算法题里有了这个概念,因为不知道这是什么蒙圈了很久。 先序遍历: root——>left——>right 中序遍历...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作