首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

二进制搜索树-插入方法- Python

二进制搜索树(Binary Search Tree,BST)是一种特殊的二叉树,其中每个节点的值都大于其左子树中的任何值,并且小于其右子树中的任何值。插入方法是向BST中添加新节点的过程。

基础概念

二进制搜索树的特点:

  • 每个节点最多有两个子节点。
  • 左子树上所有节点的值都小于根节点的值。
  • 右子树上所有节点的值都大于根节点的值。
  • 左右子树也必须分别为二叉搜索树。

插入方法:

  1. 如果树为空,则新节点成为根节点。
  2. 否则,从根节点开始比较新节点的值:
    • 如果新节点的值小于当前节点的值,则移动到左子节点继续比较。
    • 如果新节点的值大于当前节点的值,则移动到右子节点继续比较。
    • 重复上述步骤,直到找到一个空位置插入新节点。

示例代码(Python)

代码语言:txt
复制
class TreeNode:
    def __init__(self, key):
        self.left = None
        self.right = None
        self.val = key

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

# 使用示例
root = None
keys = [50, 30, 20, 40, 70, 60, 80]
for key in keys:
    root = insert(root, key)

优势

  1. 快速查找:平均时间复杂度为O(log n),在最坏情况下(树完全不平衡)为O(n)。
  2. 有序性:可以很容易地进行中序遍历以获得排序后的元素列表。
  3. 动态数据集:适合于频繁插入和删除操作的场景。

类型

  • 普通二叉搜索树:最基本的BST实现。
  • 平衡二叉搜索树(如AVL树、红黑树):通过自动调整结构保持树的平衡,确保操作的时间复杂度稳定在O(log n)。

应用场景

  • 数据库索引:快速查找和更新记录。
  • 自动补全功能:在搜索引擎或文本编辑器中快速找到可能的匹配项。
  • 符号表实现:在编译器设计中用于存储变量和函数的信息。

可能遇到的问题及解决方法

问题:树不平衡

  • 原因:连续插入有序或逆序的数据会导致树退化成链表。
  • 解决方法:使用自平衡二叉搜索树(如AVL树或红黑树),它们会在插入和删除操作后自动调整结构以维持平衡。

问题:插入操作效率低下

  • 原因:树极度不平衡时,查找和插入的时间复杂度会退化到O(n)。
  • 解决方法:定期检查树的平衡状态并进行必要的旋转操作,或选择使用自平衡树结构。

通过上述方法,可以有效管理和优化二进制搜索树的性能,确保其在各种应用场景下都能发挥最佳效果。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Python算法——二叉搜索树

Python中的二叉搜索树(Binary Search Tree,BST)算法详解 二叉搜索树是一种常见的树状数据结构,具有有序性质。...在二叉搜索树中,每个节点的值大于其左子树中的任何节点值,小于其右子树中的任何节点值。这种有序性质使得二叉搜索树具有高效的查找、插入和删除操作。...在本文中,我们将深入探讨二叉搜索树的原理,并提供Python代码实现。 二叉搜索树的特性 对于二叉搜索树中的每个节点,其左子树的所有节点的值都小于该节点的值。...对于二叉搜索树中的每个节点,其右子树的所有节点的值都大于该节点的值。 左右子树也分别为二叉搜索树。...二叉搜索树是一种强大的数据结构,具有高效的查找、插入和删除性能。通过理解其原理和实现,您将能够更好地应用二叉搜索树解决实际问题。

23910

Python实现二叉搜索树

二叉搜索树(二叉查找树,Binary Search Tree)是一种特殊的二叉树,又称为排序二叉树、有序二叉树。 二叉搜索树具有如下特性: 1....如果独立地看,左子树、右子树也分别为二叉搜索树,用递归的思想,直到树的叶节点。 下图是一个二叉搜索树的例子,可以参照图片来核对这三条特性,本文使用Python来实现二叉搜索树。...二、实现二叉搜索树类 实现一个二叉搜索树的类 SearchBinaryTree,创建二叉搜索树时,实例化一个 SearchBinaryTree 类的实例即可。...三、二叉搜索树添加节点 本文开头列出了二叉搜索树的特性,向二叉搜索树中添加节点后,一定要保证二叉搜索树仍然满足这些特性。...如果二叉搜索树是一棵空树,则直接返回 False,如果二叉搜索树非空,当根节点中的数值等于指定数值时,则说明此数值存在二叉搜索树中,返回 True,其他情况根据数值的大小递归地在左子树或右子树中进行搜索

1.1K40
  • 平衡搜索树

    2-3树 ​ 其实仔细来看2-3树好像是 B 树的一个特例,它规定了一个节点要么有一个 key 要么有两个 key。...这时候我们能够发现当且仅当我们的根节点分裂的时候我们的 2-3 树的高度才会真正的加一。这也是和 B 树的性质相似的。 ​...2-3 树最好情况就是当所有的节点都是 3 key 节点的时候,这时候我们的树高度最小,而最坏情况自然也就是一个二叉树的时候。...红黑树 红黑树我们可以把它看做为 2-3 树的变种,也就是说我们可以在 2-3 上进行一些改造生成对应的红黑树。...红黑树的插入操作 上面看到了关于红黑树的三个基本操作,这三个操作其实在我们插入的时候都是用的上的,并且重要的是在 AVL 树我们也可以仿照这种思想去完成平衡操作。

    90490

    《python算法教程》Day8 - 构建二分搜索树二分搜索树介绍二分搜索树创建代码

    今天是《python算法教程》的第8篇读书笔记,笔记的主要内容是构建二分搜索树。 二分搜索树介绍 若要对一组有序值中执行操作(如查找),二分搜索法是一个优秀的选择,因为其时间复杂度仅为对数级。...因此,这里引入二分搜索树这一既能利于二分搜索又能以对数级的时间完成搜索的数据结构。 二分搜索树创建代码 二分搜索树是一个对象,其提供插入、搜索节点和判断是否存在某个节点的方法。...#构建二分搜索树 #二分搜索树的节点的自定义类 class Node: lft=None rgt=None def __init__(self,key,val):...insert(node.lft,key.val) else: insert(node.rgt,key,val) return node #从指定节点开始搜索节点...key<node.key: return search(node.lft,key) else: return search(node.rgt,key) #定义二分搜索树类

    770130

    二叉树搜索树

    二叉搜索树 什么是二叉搜索树? 二叉搜索树首先是个二叉树,这个二叉树有这么一个特点,左子树的所有节点都比根节点小,右子树的所有节点都比根节点大。...并且左右子树也都满足这个条件 二叉搜索树又叫二叉排序树,因为它的中序遍历是有序的。...二叉搜索树的实现——K模型 K模型只存k值 二叉搜索树的每一个节点都有一个值,以及两个指针,指向左节点的指针,指向右节点的指针。...=nullptr; public: }; 插入 根据二叉搜索树的特点,我们从根节点开始查找: 如果k值小于该节点的值,去左树查找 如果k值大于该节点的值,去右树查找 如果相等返回false 结束的标志...cpp BSTree& operator=(BSTree t) { swap(root, t.root); return *this; } KV模型 一个k对应一个v,共同储存,和python

    16820

    Python实现二叉搜索树的删除功能

    二叉搜索树(二叉查找树,Binary Search Tree)又称为排序二叉树、有序二叉树。...二叉搜索树的实现可以参考:Python实现二叉搜索树 本文使用 Python 实现二叉搜索树的删除功能,在此之前必须先知道二叉搜索树的特性: 1....如果独立地看,左子树、右子树也分别为二叉搜素树。 一、准备二叉搜索树类 在实现二叉搜索树的删除功能前,先实现一个二叉搜索树的类 SearchBinaryTree 。...在二叉搜索树中查找节点的方法 search(root, data),要从二叉搜索树中删除节点,首先要保证节点是属于二叉搜索树的,所以先搜索节点是否在二叉搜索树中。...所以,删除非叶节点时,必须从子树中选择一个节点来填补被删除的节点位置,避免树的断裂,也避免“牵连”到其他的节点,还要保证删除节点后的二叉树依然是一棵二叉搜索树,满足二叉搜索树的特性。

    88920

    【python】蒙特卡洛树搜索(MCTS)简单实现

    self.cumulative_choices+[random_choice]) return next_state def monte_carlo_tree_search(node):#蒙特卡洛树搜索总函数...然而,其庞大的搜索空间,以及局面棋势的复杂度,使得传统的剪枝搜索算法在围棋面前都望而却步。在AlphaGo出现之前,MCTS算法算是一类比较有效的算法。...即便是与依赖Monte Carlo搜索的围棋博弈程序相比,不依赖任何搜索的RL policy network,也已经达到了85%的赢面。...与经典的MCTS算法类似,APV-MCTS(asynchronous policy and value MCTS)的每一轮模拟也包含四个步骤: Selection:APV-MCTS搜索树中的每条连边(s...这是因为,与RL policy network相比,由人类专家走法训练出来的SL policy network在策略上的多样性更强;因此更适用于MCTS中的搜索。

    2.3K20

    二叉树:搜索树转成累加树

    538.把二叉搜索树转换为累加树 题目链接:https://leetcode-cn.com/problems/convert-bst-to-greater-tree/ 给出二叉 搜索 树的根节点,该树的节点值各不相同...提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。...然后再发现这是一颗二叉搜索树,二叉搜索树啊,这是有序的啊。 那么有序的元素如果求累加呢?...往期精彩回顾 二叉树:构造一棵搜索树 二叉树:修剪一棵搜索树 二叉树:搜索树中的删除操作 二叉树:搜索树中的插入操作 二叉树:搜索树的公共祖先问题 本周小结!...(二叉树系列四) 二叉树:公共祖先问题 二叉树:我的众数是多少? 二叉树:搜索树的最小绝对差 二叉树:我是不是一棵二叉搜索树 二叉树:二叉搜索树登场! 二叉树:合并两个二叉树 本周小结!

    56721

    【C++】二叉搜索树(搜索二叉树)

    1.二叉树搜索的概念及性能 1.1 概念 ⼆叉搜索树⼜称⼆叉排序树,它有可能是⼀棵空树,或者是具有以下性质的⼆叉树: 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于或等于根结点的值 若它的右⼦树不为空...最优情况下:⼆叉搜索树为完全⼆叉树(或者接近完全⼆叉树),其⾼度为: 最坏情况下:⼆叉搜索树退化为单⽀树(或者类似单⽀),其⾼度近似为节点个数: 所以综合⽽⾔⼆叉搜索树增删查改时间复杂度为: 那么这样的效率显然是...⽆法满⾜我们需求的,我们后续课程需要继续讲解⼆叉搜索树的变形,平衡⼆叉搜索树、AVL树和红⿊树,才能适⽤于我们在内存中存储和搜索数据。...key的搜索场景实现的⼆叉树搜索树⽀持增删查,但是 不⽀持修改 ,修改key破坏搜索树结构了。...key/value的搜索场景实现的⼆叉树搜索树⽀持修改,但是 不⽀持修改key ,修改key破坏搜索树性质了, 可以修改value 。

    7810

    二叉搜索树

    二叉搜索树的查找 2. 二叉搜索树的插入 3. 二叉搜索树的删除 4....拷贝构造函数以及重载运算符=的实现 5.析构函数 二叉搜索树的完整代码: 三、二叉搜索树的KV用法 ---- 一、概念 二叉搜索树又称二叉排序树,它或者是一棵空树 , 或者是具有以下性质的二叉树:...二叉搜索树的查找 从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。...二叉搜索树的插入 树为空,则直接新增节点,赋值给root指针 树不空,按二叉搜索树性质查找插入位置,插入新节点(一颗二叉搜索树不能存在同样的数据) 代码实现: bool Insert(const K...KV用法 K就是二叉搜索树的第一个参数key,V就是第二个参数value。

    47540

    二叉搜索树

    二叉搜索树 1.1 二叉搜索树的概念 二叉搜索树是在普通的二叉树上进阶的,所以咱们今天的内容也可以说是,数据结构二叉树的进阶。...二叉搜索树可谓是起到了承上启下的作用,向前承接了数据结构的二叉树,向后对于map和set的模拟实现也起到了启示作用。 那什么是二叉搜索树呢?...我们对于具有以下特征的二叉树为二叉搜索树: 若左子树不为空,则左子树所有节点的值比根节点的值小 若右子树不为空,则右子树所有节点的值比根节点的值大 左右子树都是二叉搜索树 1.2 二叉搜索树的常用操作以及实现...1.2.1 二叉搜索树的查找操作 查找操作要求我们从跟开始找,如果要找的值小于根节点的值,则走左子树,反之走右子树。...二叉搜索树的性能分析 对于比较完美的搜索树,比如下图左边这种情况: 这种时间复杂度是O(logN)的。 而对于右边的这种极端情况,时间复杂度是O(N)的。

    7310

    二叉搜索树

    二叉查找树满足以下性质:(假设二叉查找树中每个节点元素都是不同的,它也可以为空) 非空左子树的所有键值小于其根节点的键值; 非空右子树的所有键值大于其根节点的键值; 左,右两棵子树都是二叉搜索树 二叉搜索树本质上还是一棵二叉树...对二叉搜索树的遍历和创建操作与普通二叉树一致。但是二叉搜索树的特点使得对它的查找,插入,删除变得有些不同。 二叉搜索树的平均深度是O(logn)的,一般不会造成爆栈的。...二叉搜索树则可以支持插入和删除操作,它使得查找的范围可以动态变化,称之为动态查找。...如果按照查找操作是如何进行的来分类,那么二叉搜索树和二分查找都是基于比较实现的;另外一种实现查找的方式是基于映射实现的,即:散列表,或者称之为哈希表。...BST 二叉搜索树操作集的C++实现代码: #include "searchtree.h" //递归版本实现的查找函数,二叉树的平均深度是O(log n),可以递归的 Position Find(ElementType

    47820

    二叉搜索树

    前言 二叉搜索树的定义: 若左子树不为空,则左子树上所有节点的值都小于根节点的值; 若右子树不为空,则右子树上所有节点的值都大于根节点的值。 树中不会有重复的元素。...二叉搜索树最左侧结点一定是最小的,最右侧一定是最大的; 对二叉搜索树进行中序遍历,一定能够得到一个有序序列。...){ tmp1 = tmp; tmp = tmp.left; } return tmp1; } 最优情况下:二叉搜索树为完全二叉树...,其平均比较次数为:log2 (n) 最坏情况下:二叉搜索树退化为单支树,其平均比较次数为:n/2 四、完整代码 public class BinarySearchTree { static...tmp1 = tmp; tmp = tmp.left; } return tmp1; } } ---- 结语 代码链接在这里哦~ 二叉搜索树

    13030

    js 中树的搜索

    在处理树形结构时,选择合适的查找方法(递归、迭代、广度优先搜索、使用第三方库)取决于具体的应用场景、树的规模、性能需求以及代码维护性。...递归搜索 优点 代码简洁直观:递归方法通常代码量少,逻辑清晰,易于理解和实现。 易于维护:由于代码结构简单,后期维护和修改也较为方便。...适用场景 树的深度有限:适用于树的深度较浅或中等的情况。 优先代码可读性:当代码的简洁性和可读性优先于极限性能时。...(深度优先搜索,DFS) 优点 避免栈溢出:通过显式使用栈结构,避免了递归的调用栈限制,适用于非常深的树。...当树的深度较大或存在栈溢出风险 迭代搜索(DFS 或 BFS)是更稳健的选择。深度优先搜索(DFS)适用于需要深入查找的场景,而广度优先搜索(BFS)适用于需要按层级查找的场景。

    10010
    领券