算法学习记录-查找——二叉排序树(Binary Sort Tree)

算法学习记录-查找——二叉排序树(Binary Sort Tree)

一、什么是二叉排序树(Binary Sort Tree)

二叉排序树,又称二叉搜索树或二叉查找树,是一种特殊的二叉树,它的每个节点的左子树所有节点的值都小于该节点的值,而右子树所有节点的值都大于该节点的值。

在二叉排序树中,查找、插入和删除等操作的时间复杂度都是 O(logn),非常高效。

二、二叉排序树的构建

在构建二叉排序树时,我们可以依次将新节点插入到根节点的左右子树中,保证左子树中所有节点的值都小于根节点的值,右子树中所有节点的值都大于根节点的值。如果待插入的节点的值与根节点的值相等,我们可以选择将其放入左子树或右子树。

以下是一个简单的构建二叉排序树的例子:

class Node:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

class BST:
    def __init__(self):
        self.root = None

    def insert(self, val):
        if self.root is None:
            self.root = Node(val)
        else:
            self._insert(val, self.root)

    def _insert(self, val, node):
        if val < node.val:
            if node.left is None:
                node.left = Node(val)
            else:
                self._insert(val, node.left)
        else:
            if node.right is None:
                node.right = Node(val)
            else:
                self._insert(val, node.right)

三、二叉排序树的操作

查找

在二叉排序树中查找节点其实就是不断地比较节点的值,如果待查找的节点值小于当前节点的值,则继续在左子树中查找,如果待查找的节点值大于当前节点的值,则继续在右子树中查找。如果找到了待查找的节点,则返回该节点,否则返回 None。

以下是一个简单的查找操作的例子:

class BST:
    def __init__(self):
        self.root = None

    def insert(self, val):
        # 略

    def search(self, val):
        return self._search(val, self.root)

    def _search(self, val, node):
        if node is None:
            return None
        elif node.val == val:
            return node
        elif val < node.val:
            return self._search(val, node.left)
        else:
            return self._search(val, node.right)

插入

在二叉排序树中插入节点其实就是查找待插入的节点在树中的位置,然后将其插入到合适的位置上。

以下是一个简单的插入操作的例子:

class BST:
    def __init__(self):
        self.root = None

    def insert(self, val):
        if self.root is None:
            self.root = Node(val)
        else:
            self._insert(val, self.root)

    # 略

    def _insert(self, val, node):
        # 略

删除

在二叉排序树中删除节点其实就是查找待删除的节点在树中的位置,然后将其从树中删除,并保证删除后仍然是一棵二叉排序树。

一般来说,删除节点有以下三种情况:

  1. 待删除的节点没有子节点。直接删除即可。
  2. 待删除的节点只有一个子节点。将该子节点替代待删除的节点即可。
  3. 待删除的节点有两个子节点。此时需要找到该节点的后继节点或前驱节点作为替代节点。

以下是一个简单的删除操作的例子:

class BST:
    def __init__(self):
        self.root = None

    def insert(self, val):
        # 略

    # 略

    def delete(self, val):
        self._delete(val, self.root)

    def _delete(self, val, node):
        if node is None:
            return node

        if val < node.val:
            node.left = self._delete(val, node.left)
        elif val > node.val:
            node.right = self._delete(val, node.right)
        else:
            if node.left is None:
                temp = node.right
                node = None
                return temp
            elif node.right is None:
                temp = node.left
                node = None
                return temp

            temp = self.find_min(node.right)
            node.val = temp.val
            node.right = self._delete(temp.val, node.right)

        return node

    def find_min(self, node):
        while node.left:
            node = node.left
        return node

四、总结

二叉排序树是一种高效的排序和查找算法,可以用于实现查找、插入、删除等操作。在实际应用中,我们需要根据具体的情况选择不同的实现方式,以达到最优的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:算法学习记录-查找——二叉排序树(Binary Sort Tree) - Python技术站

(0)
上一篇 2023年3月28日
下一篇 2023年3月28日

相关文章

  • 深入理解C++中变量的存储类别和属性

    深入理解C++中变量的存储类别和属性 C++中的变量存储类别和属性决定了变量在内存中的存储方式和生命周期。了解这些概念对于编写高效、可靠的C++代码至关重要。本攻略将详细介绍C++中的存储类别和属性,并提供示例说明。 存储类别 C++中的存储类别决定了变量的生命周期和可见性。C++提供了以下四种存储类别: 自动存储类别(auto):这是默认的存储类别,用于定…

    other 2023年7月29日
    00
  • Java中双向链表详解及实例

    Java中双向链表详解及实例 什么是双向链表? 双向链表是一种经典的线性数据结构,它不仅能够支持插入、删除操作,而且还能够支持在链表中任何位置进行查找操作。 双向链表的每个节点都有两个指针,分别是指向前驱节点和后继节点的指针,这样就可以通过前向和后向遍历节点,从而实现各种操作。 双向链表的定义 下面是Java语言中双向链表的定义: class Node { …

    other 2023年6月27日
    00
  • win11开机无法登陆反复重启怎么办 ?win11开机无法登陆反复重启解决方法

    针对“win11开机无法登陆反复重启”的问题,有以下几种解决方法。 方法1:重置系统 如果出现开机无法登陆的情况,我们可以尝试通过系统重置来解决问题。具体步骤如下: 进入Windows 11开机界面,点按“电源按钮”,并立即按住“Shift”键。这样会进入Windows的高级启动选项。 在高级启动选项界面,选择“疑难解答”> “重置此PC”> “…

    other 2023年6月26日
    00
  • 手机内存空间里有个youmicache文件夹能删吗?youmicache文件夹是干什么用的?

    手机内存空间里的youmicache文件夹能删吗?youmicache文件夹是干什么用的? 你好!youmicache文件夹是一种用于存储应用程序缓存数据的文件夹。在Android系统中,许多应用程序会使用缓存来提高性能和加载速度。youmicache文件夹是其中一个常见的缓存文件夹之一。删除youmicache文件夹可能会有一些影响,但通常是安全的。 在大…

    other 2023年8月1日
    00
  • poi解析excel内容

    以下是关于“POI解析Excel内容”的完整攻略: 步骤1:准备数据 首先,需要准备要解析的Excel文件。可以使用Java的POI库来读取和解析文件。在本攻略中,我们将使用一个名为example.xlsx的Excel文件作为示例。 步骤2:使用POI库解析Excel内容 接下来,需要使用POI库来解析Excel内容。可以使用Workbook、Sheet和R…

    other 2023年5月7日
    00
  • delphi中messagebox用法

    以下是Delphi中MessageBox用法的攻略,包含两个示例: 什么是MessageBox? MessageBox是Delphi中的一个函数,用于在应用程序中显示消息框。消息框是一种常见的用户界面元素,用于向用户显示信息、警告或错误。 如何使用MessageBox? 要使用MessageBox,您可以按照以下步骤进行操作: 打开Delphi IDE并创建…

    other 2023年5月6日
    00
  • 服务器bmc(带外)

    当然,我很乐意为您提供有关服务器BMC(带外管理控制器)的完整攻略。以下是详细的步骤和两个示例: 1. 什么是服务器BMC? BMC是一种独立的管理控制器,它可以在服务器关闭或操作系统崩溃时提供远程管理功能。BMC通常包括一个独立的处理器、内存、网络接口和存储器,可以通过网络远程访问和管理服务器。 2. BMC的基本功能 BMC的基本功能包括: 远程开关机 …

    other 2023年5月6日
    00
  • iPhone手机更新iOS13一直显示正在估算剩余时间的3种解决方法

    针对iPhone手机更新iOS13一直显示正在估算剩余时间的情况,我为您提供以下三种解决方法: 方法一:重启 iPhone 有时候,仅仅重启 iPhone 就可以解决更新卡在估算剩余时间的问题。具体操作步骤如下: 长按 iPhone 的电源键,直到您看见“滑动关机”选项出现。 向右滑动屏幕上的“滑动关机”按钮,关机 iPhone。 等待几分钟后,再按一次电源…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部