如何实现一个高效的二叉搜索树(BST)?请给出时间复杂度分析。

简介: 本文介绍了使用AVL树实现高效二叉搜索树的方法,包括插入、删除和查找操作的Python代码。节点类包含键值、左右子节点和高度属性。插入和删除操作通过维护树的平衡(高度差不超过1)确保O(log n)的时间复杂度,查找操作同样具有O(log n)的时间复杂度。

要实现一个高效的二叉搜索树(BST),可以使用AVL树或红黑树等自平衡二叉搜索树。这里以AVL树为例,给出插入、删除和查找操作的代码实现及时间复杂度分析。

首先,定义一个节点类:

class TreeNode:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
        self.height = 1

接下来,实现AVL树的插入操作:

def insert(root, key):
    if not root:
        return TreeNode(key)
    if key < root.key:
        root.left = insert(root.left, key)
    else:
        root.right = insert(root.right, key)

    root.height = 1 + max(get_height(root.left), get_height(root.right))

    balance = get_balance(root)

    if balance > 1:
        if key < root.left.key:
            return right_rotate(root)
        else:
            root.left = left_rotate(root.left)
            return right_rotate(root)

    if balance < -1:
        if key > root.right.key:
            return left_rotate(root)
        else:
            root.right = right_rotate(root.right)
            return left_rotate(root)

    return root

然后,实现AVL树的删除操作:

def delete(root, key):
    if not root:
        return root

    if key < root.key:
        root.left = delete(root.left, key)
    elif key > root.key:
        root.right = delete(root.right, key)
    else:
        if root.left is None:
            temp = root.right
            root = None
            return temp
        elif root.right is None:
            temp = root.left
            root = None
            return temp

        temp = get_min_value_node(root.right)
        root.key = temp.key
        root.right = delete(root.right, temp.key)

    if root is None:
        return root

    root.height = 1 + max(get_height(root.left), get_height(root.right))

    balance = get_balance(root)

    if balance > 1:
        if get_balance(root.left) < 0:
            root.left = left_rotate(root.left)
        return right_rotate(root)

    if balance < -1:
        if get_balance(root.right) > 0:
            root.right = right_rotate(root.right)
        return left_rotate(root)

    return root

最后,实现AVL树的查找操作:

def search(root, key):
    if not root or root.key == key:
        return root
    if key < root.key:
        return search(root.left, key)
    return search(root.right, key)

时间复杂度分析:

  • 插入操作的时间复杂度为O(log n),因为每次插入后,树的高度会减少,从而保证树的平衡性。
  • 删除操作的时间复杂度也为O(log n),同样是因为每次删除后,树的高度会减少,从而保证树的平衡性。
  • 查找操作的时间复杂度为O(log n),因为在AVL树中,每个节点的左子树和右子树的高度差最多为1,所以查找操作的时间复杂度为O(log n)。
相关文章
|
存储 Java C++
JVM、Java编译器和Java解释器
JVM、Java编译器和Java解释器 java解释器就是把在java虚拟机上运行的目标代码(字节码)解释成为具体平台的机器码的程序。即jdk或jre目录下bin目录中的java.exe文件,而javac.exe是编译器。
1618 0
|
6月前
|
人工智能 Cloud Native 数据可视化
微医控股与阿里云达成战略合作,双方将携手基于通义千问大模型联合打造医疗全场景智能体,共同构建医疗垂类大模型
2025年6月17日,微医控股与阿里云达成战略合作,共建医疗AI基座及医疗全场景智能体。双方将基于通义千问大模型打造医疗垂类大模型,升级微医“5+1”智能体,并在诊断、用药、健康管理等环节深化应用。微医将结合阿里云技术优势推进IDC上云,助力AI+医疗基础设施建设,共同制定行业标准并推广城市级AI数字健共体。目前,微医AI服务已连接全国1.2万家医院和30万名医生,健康管理会员超100万。
987 2
|
9月前
|
数据采集 机器学习/深度学习 存储
可穿戴设备如何重塑医疗健康:技术解析与应用实战
可穿戴设备如何重塑医疗健康:技术解析与应用实战
357 4
|
存储 人工智能 大数据
物联网、大数据、云计算、人工智能之间的关系
物联网、大数据、云计算、人工智能之间的关系是紧密相连、相互促进的。这四者既有各自独立的技术特征,又能在不同层面上相互融合,共同推动信息技术的发展和应用。
3484 0
|
安全 Java 测试技术
最佳实践:通义灵码生成单元测试,让单测更简单
本文首先讲述了什么是单元测试、单元测试的价值、一个好的单元测试所具备的原则,进而引入如何去编写一个好的单元测试,通义灵码是如何快速生成单元测试的。
|
Java 测试技术 持续交付
自动化测试框架选型与实战:深入探索与应用
【5月更文挑战第8天】本文探讨了自动化测试框架的选型与实战应用,强调了其在软件质量保障中的重要性。选型原则包括考虑项目需求、技术栈、可扩展性和可维护性,以及社区支持和文档。介绍了Selenium、Appium、JUnit和Pytest等常用框架,并概述了实战应用的步骤,包括明确需求、搭建环境、编写测试用例、执行测试、分析结果、维护代码和持续集成。合理选型与实践能提升测试效率,保障项目成功。
|
Prometheus 监控 Cloud Native
Grafana 入门指南:快速上手监控仪表盘
【8月更文第29天】Grafana 是一款开源的数据可视化和监控工具,它允许用户轻松地创建美观的仪表盘和图表,以便更好地理解和监控数据。无论您是需要监控系统性能指标、应用程序日志还是业务关键指标,Grafana 都能提供灵活而强大的解决方案。本指南将带领您快速上手 Grafana,包括安装、配置以及创建第一个监控面板。
3271 2
|
数据采集 JSON API
使用Python获取B站视频并在本地实现弹幕播放功能
使用Python获取B站视频并在本地实现弹幕播放功能
484 0
|
数据安全/隐私保护
哪家好用?四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk(一)
哪家好用?四款国内外远程桌面软件横测:ToDesk、向日葵、TeamViewer、AnyDesk
1092 1
下载imagenet2012数据集
摸索了一下,imagenet2012下载,跟大家分享一下 用迅雷会员加速都可以下载,有的用百度云也可以离线下载http://www.image-net.org/challenges/LSVRC/2012/nnoupb/ILSVRC2012_img_test.
7700 0