算法学习记录-查找——二叉排序树(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日

相关文章

  • R语言中的vector(向量),array(数组)使用总结

    接下来我将介绍一下“R语言中的vector(向量),array(数组)使用总结”,主要包括以下几个部分: 向量(vector)的定义和使用 数组(array)的定义和使用 示例说明 1. 向量(vector)的定义和使用 向量是R语言中最基本的数据结构之一,它的定义方式很简单,只需要用c()函数把多个元素组合在一起即可,如下所示: # 定义一个向量 v &l…

    other 2023年6月25日
    00
  • 微信开发者工具如何修改日志行数?微信开发者工具修改日志行数教程

    微信开发者工具如何修改日志行数攻略 微信开发者工具是开发微信小程序的重要工具之一,它提供了丰富的功能来帮助开发者进行调试和测试。其中,修改日志行数是一个常见需求,下面是详细的攻略。 步骤一:打开微信开发者工具 首先,打开微信开发者工具,并选择你要修改日志行数的小程序项目。 步骤二:进入设置页面 在微信开发者工具的顶部菜单栏中,点击“设置”按钮,然后选择“设置…

    other 2023年7月27日
    00
  • 魔兽世界7.3.5增强萨怎样输出 增强萨团本大秘境输出手法及技能循环

    魔兽世界增强萨输出攻略 1. 技能循环 增强萨是近战攻击职业,主要依靠奥术打击和风暴打击两个技能来输出伤害。以下是常用的技能循环: 狂暴之怒 (准备阶段) 巨人打击 (开场) 奥术打击 + 风暴打击(交替使用) 焚烧 + 元素掌握 + 闪电之盾 (用技能积攒能量) 巨人打击 + 奥术打击 + 风暴打击 重复以上步骤直到目标死亡 2. 属性和装备 增强萨主要依…

    other 2023年6月27日
    00
  • word文档打开速度慢的几个原因和解决方法

    接下来我将详细讲解“word文档打开速度慢的几个原因和解决方法”的完整攻略,内容包含以下方面: 原因 在解决问题之前,首先需要了解一下它发生的原因,这样才能有针对性地解决问题。下面是word文档打开速度慢的几个原因: 1.文档过大 如果文档的大小超过几MB,那么打开文档的时间就会明显增加,尤其是对于低配置的计算机或者运行较慢的软件,打开时间甚至会超过几分钟。…

    other 2023年6月27日
    00
  • 批处理BAT脚本中set命令的使用详解(批处理之家Batcher)

    批处理BAT脚本中set命令的使用详解 在批处理BAT脚本中,set命令是一个非常有用的命令,用于设置和显示环境变量。它可以用于存储和检索各种类型的数据,包括字符串、数字和文件路径等。本攻略将详细介绍set命令的使用方法和示例。 设置环境变量 set命令可以用于设置环境变量,语法如下: set 变量名=值 其中,变量名是要设置的环境变量的名称,值是要为该环境…

    other 2023年8月15日
    00
  • Vue使用Proxy代理后仍无法生效的解决

    Vue使用Proxy代理后仍无法生效的解决 问题描述 在开发Vue项目过程中,使用了Proxy代理进行数据劫持,但是在实际运行过程中发现代理并没有生效,也就是说数据并没有被劫持。这种情况的原因主要是: 必须确保Vue实例中的data数据是一个对象,否则无论如何Proxy都无法代理成功。 Vue3中重写了响应式系统,导致Vue2中的一些Proxy语法在Vue3…

    other 2023年6月27日
    00
  • 微信小程序如何设置基本的页面样式,做出用户界面UI

    当设置微信小程序的页面样式和用户界面(UI)时,可以使用WXML和WXSS来实现。下面是一个完整的攻略,包含两个示例说明: 步骤1:创建页面 首先,在微信小程序的项目中创建一个新的页面。可以通过在项目根目录下的pages文件夹中创建一个新的文件夹,并在其中添加wxml和wxss文件来创建页面。 示例说明1:创建一个名为home的页面。 步骤2:设置页面样式 …

    other 2023年9月6日
    00
  • python判断链表是否有环的实例代码

    题目描述:给定一个链表,判断链表是否有环。 思路分析 这个问题可以使用快慢指针解决。两个指针同时从头开始,一个每次走一步,一个每次走两步。如果链表上有环,那么这两个指针最终一定会相遇。如果指针走到 None 了,那么就说明不存在环。 代码实现 以下是Python实现的代码: class ListNode(object): def __init__(self,…

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