数据结构与算法-二分搜索树

news2024/9/19 9:55:29

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快!

文章目录

      • 引言
      • 一、二分搜索树的基本概念
      • 二、二分搜索树的操作
      • 三、二分搜索树的实现
        • 1. 示例树
        • 2. 二分搜索树节点类
        • 3. 二分搜索树类
      • 四、二分搜索树的操作实现
        • 1. 插入节点
        • 2. 查找节点
        • 3. 删除节点
      • 五、总结

引言

二分搜索树是一种特殊的二叉树,它具有独特的性质,使得在树中查找、插入和删除元素变得非常高效。本文将深入探讨二分搜索树的基本原理、实现步骤,并通过具体的案例代码详细说明二分搜索树的每一个细节。

一、二分搜索树的基本概念

二分搜索树是一种满足以下条件的二叉树:

  1. 左子树:每个节点的左子树中的所有节点的值都小于该节点的值。
  2. 右子树:每个节点的右子树中的所有节点的值都大于该节点的值。
  3. 唯一性:树中不允许存在重复的键值。

二、二分搜索树的操作

二分搜索树支持以下主要操作:

  1. 插入节点:将一个新节点插入到树中适当的位置。
  2. 查找节点:在树中查找具有给定键值的节点。
  3. 删除节点:从树中删除一个节点。
  4. 遍历树:按某种顺序遍历树中的所有节点。
    在这里插入图片描述

三、二分搜索树的实现

接下来,我们将通过一个示例来详细了解二分搜索树的实现步骤。

1. 示例树

考虑一个整数二分搜索树,包含以下节点:4, 2, 6, 1, 3, 5, 7

2. 二分搜索树节点类

首先定义二分搜索树的节点类:

class TreeNode:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
3. 二分搜索树类

定义二分搜索树类,实现主要的操作:

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

    def insert(self, key):
        self.root = self._insert(self.root, key)

    def _insert(self, node, key):
        if node is None:
            return TreeNode(key)
        if key < node.key:
            node.left = self._insert(node.left, key)
        elif key > node.key:
            node.right = self._insert(node.right, key)
        return node

    def find(self, key):
        return self._find(self.root, key)

    def _find(self, node, key):
        if node is None or node.key == key:
            return node
        if key < node.key:
            return self._find(node.left, key)
        return self._find(node.right, key)

    def delete(self, key):
        self.root = self._delete(self.root, key)

    def _delete(self, node, key):
        if node is None:
            return node
        if key < node.key:
            node.left = self._delete(node.left, key)
        elif key > node.key:
            node.right = self._delete(node.right, key)
        else:
            if node.left is None:
                return node.right
            elif node.right is None:
                return node.left
            else:
                # Find the minimum node in the right subtree
                min_node = self._find_min(node.right)
                node.key = min_node.key
                node.right = self._delete(node.right, min_node.key)
        return node

    def _find_min(self, node):
        while node.left is not None:
            node = node.left
        return node

    def inorder_traversal(self):
        return self._inorder_traversal(self.root, [])

    def _inorder_traversal(self, node, traversal):
        if node:
            traversal = self._inorder_traversal(node.left, traversal)
            traversal.append(node.key)
            traversal = self._inorder_traversal(node.right, traversal)
        return traversal

四、二分搜索树的操作实现

1. 插入节点

插入节点的过程包括:

  1. 递归查找:从根节点开始,递归地查找适当的插入位置。
  2. 创建节点:到达适当位置后,创建新节点并将其插入到树中。
bst = BinarySearchTree()
keys = [4, 2, 6, 1, 3, 5, 7]

for key in keys:
    bst.insert(key)

# 打印中序遍历结果
print("Inorder Traversal after insertion:", bst.inorder_traversal())
2. 查找节点

查找节点的过程包括:

  1. 递归查找:从根节点开始,递归地查找具有给定键值的节点。
# 查找键值为5的节点
node = bst.find(5)
if node:
    print("Found node with key:", node.key)
else:
    print("Node not found")
3. 删除节点

删除节点的过程包括:

  1. 查找节点:找到要删除的节点。
  2. 替换节点:根据节点的不同情况(无子节点、单子节点、双子节点)进行替换或删除。
# 删除键值为6的节点
bst.delete(6)

# 打印中序遍历结果
print("Inorder Traversal after deletion:", bst.inorder_traversal())

五、总结

二分搜索树是一种非常实用的数据结构,尤其适用于需要频繁查找、插入和删除元素的应用场景。在实际编程中,二分搜索树可以用于实现高效的数据存储和检索,例如在数据库索引、符号表等领域有着广泛的应用。


喜欢博主的同学,请给博主一丢丢打赏吧↓↓↓您的支持是我不断创作的最大动力哟!感谢您的支持哦😘😘😘
打赏下吧

💝💝💝如有需要请大家订阅我的专栏【数据结构与算法】哟!我会定期更新相关系列的文章
💝💝💝关注!关注!!请关注!!!请大家关注下博主,您的支持是我不断创作的最大动力!!!

数据结构与算法相关文章索引文章链接
数据结构与算法-插入排序数据结构与算法-插入排序
数据结构与算法-希尔排序数据结构与算法-希尔排序
数据结构与算法-归并排序数据结构与算法-归并排序
数据结构与算法-随机快速排序数据结构与算法-随机快速排序
数据结构与算法-双路快速排序数据结构与算法-双路快速排序
数据结构与算法-三路排序数据结构与算法-三路排序
数据结构与算法-关于堆的基本存储介绍数据结构与算法-关于堆的基本存储介绍
数据结构与算法-关于堆的基本排序介绍数据结构与算法-关于堆的基本排序介绍
数据结构与算法-索引堆及其优化数据结构与算法-索引堆及其优化

❤️❤️❤️觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1963096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[ONVIF系列 - 01] 简介 - 设备发现 - 相关工具

1.背景知识 这个事项对我而言是个新知&#xff0c;我从&#xff1a;https://www.cnblogs.com/liwen01/p/17337916.html 跳转到了&#xff1a;ONVIF协议网络摄像机&#xff08;IPC&#xff09;客户端程序开发&#xff08;1&#xff09;&#xff1a;专栏开篇_onvif 许振坪-CSDN…

数字人直播系统搭建能力评测!3招教你快速摸清源码厂商的真实实力?

随着数字人直播的应用场景不断拓展和应用频率的持续升高&#xff0c;其所蕴含着的市场前景和收益潜力逐渐显现&#xff0c;连带着数字人直播系统搭建的热度也迎来了新的高潮。在此背景下&#xff0c;作为非科班和研发资源有限的创业者们主要的入局途径&#xff0c;各大数字人源…

Vatee万腾平台:智能管理领域的稳健前行者

在数字经济飞速发展的今天&#xff0c;企业管理模式正经历着前所未有的变革。智能化管理&#xff0c;作为这场变革的核心驱动力&#xff0c;正逐步渗透到企业的每一个角落。而在这场智能化浪潮中&#xff0c;Vatee万腾平台以其稳健的步伐和前瞻的视野&#xff0c;成为了智能管理…

【LLM大模型】一个小时内快速部署大模型

这个教程有以下几部分构成&#xff1a; 硬件配置概念介绍实操测试结果 1.硬件配置 本文使用的方法配置要求低&#xff0c;没有gpu也可以正常使用(就是有点慢)&#xff0c;不管是windows 还是linux&#xff0c;都可以无障碍使用大模型&#xff0c;有脚就行&#xff0c;废话少…

开放式耳机哪个牌子好?五款热门机型对比pk大揭秘!

作为一名耳机测评师&#xff0c;很多人想要知道如何才能选择一款合适自己的开放式耳机&#xff0c;其实我也非常的犯难&#xff0c;因为问的人实在是太多了&#xff0c;而且每个人的情况都不一样&#xff0c;所以不能说我指定的机型就一定适合你&#xff0c;所以这篇文章就是来…

【python】高数计算题难度大?python带你轻松拿下

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

ansys fluent流道分析得到的质量流率为负数

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

从技术角度看视频美颜SDK:实现美颜功能的关键算法

本篇文章&#xff0c;笔者将从技术角度&#xff0c;深入探讨视频美颜SDK实现美颜功能的关键算法。 1.人脸检测与特征点定位 人脸检测主要采用的是卷积神经网络等深度学习算法&#xff0c;这些算法能够在不同光照、姿态和表情下准确识别出人脸。 常见的算法包括Dlib库中的68点…

开发环境搭建——Redis的安装配置

1、msi安装 双击msi安装程序&#xff0c;打开安装向导&#xff0c;点击next 接收终端用户协议&#xff0c;点击next 选择安装路径&#xff0c;并勾选将安装路径添加到系统的PATH环境变量 设置Redis服务端口&#xff0c;默认6379&#xff0c;点击next 设置最大内存限制&#xf…

Golang基础常识性知识面试中常见的六大陷阱及应对技巧

一、nil slice & empty slice 1、nil切片与空切片底层 nil切片&#xff1a;var nilSlice [] string nil slice的长度len和容量cap都是0 nil slicenil nil slice的pointer是nil 空切片&#xff1a;emptySlice0 : make([]int,0) empty slice的长度是0&#xff0c;容量是由…

算法初学者学二分查找

力扣704&#xff0c;二分查找 题目是这样的 二分查找的思路就是&#xff1a; 先确定左右两个边界&#xff0c;左边界是从左往右&#xff0c;右边界是从右往左&#xff0c;所以&#xff0c;左边界是找的比target大的第一个值&#xff0c;右边界最后停的点是比target小的第一个…

谢希仁计算机网络第八版期末复习简答(1)

绪论 计算机网络的概念以及常见的网络类型? 计算机网络&#xff0c;是指地理位置分散的、具有独立功能的多台计算机及其外部设备&#xff0c;通过各种通信线路互联起来&#xff0c;在网络操作系统、网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息…

2024年的AI人工智能风口是Python?一篇文章告诉你为什么!

Python是一种面向对象的、解释型的、通用的、开源的脚本编程语言&#xff0c;它之所以非常流行&#xff0c;我认为主要有三点原因&#xff1a; 1.Python 简单易用&#xff0c;学习成本低&#xff0c;看起来非常干净&#xff1b; 2.Python 标准库和第三库众多&#xff0c;功能…

短剧系统源码分享,快速搭建部署上线教程

一、短剧系统是什么&#xff1f; 短剧制作平台&#xff0c;作为一站式综合解决方案&#xff0c;集剧本创作、角色设计、场景搭建、视频编辑、便捷发布及深度数据分析能力于一身。该平台精准定位于助力企业利用短剧形式强化品牌传播力并驱动商业价值增长&#xff0c;无论企业是…

物理学中三个令人兴奋的想法:稳态作用原理、洛伦兹变换和度量张量

​ 图片来源&#xff1a; https 文章目录 ​一、说明二、最小行动原则三、洛伦兹变换四、Minkowski 公制五、度量张量&#xff1a;曲面的几何形状六、三维欧几里得距离。 ​一、说明 虽然物理学引起了公众的好奇心&#xff0c;但许多人发现数学令人生畏。然而&#xff0c;物理…

C#知识|文件与目录操作:目录的操作

哈喽,你好啊,我是雷工! 前边学习了文件的删除、复制、移动,接下来学习目录的操作。 以下为学习笔记。 01 效果演示 1.1、显示指定目录下的所有文件 在左侧的文本框中显示出F:\F004-C#目录下的所有文件, 演示效果: 1.2、显示指定目录下的所有子文件 在左侧的文本框中显…

Serverless Knative冷启动与自动扩缩容研究:从原理到实践

最近一个研究生网页的提问&#xff0c;然后就有了这篇博客&#xff01; 大佬你好&#xff0c;我看到您的关于Serverless的文章于是十分冒昧的向您提问。我现在是一名在研究通过Serverless容器调度解决冷启动问题的本科生&#xff0c;导师放养&#xff0c;就让看论文但是后面的代…

多态、接口、类练习题

代码&#xff1a; public static void main(String[] args) {Person2 personnew Person2("唐僧",new Horse());person.passRiver();person.onRoad();} 接口&#xff1a; interface Vehicles{public void work(); } lass Horse implements Vehicles{Overridepubli…