广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python实现二叉搜索树的方法有哪些
  • 542
分享到

python实现二叉搜索树的方法有哪些

2023-07-06 01:07:06 542人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

这篇文章主要介绍“python实现二叉搜索树的方法有哪些”,在日常操作中,相信很多人在Python实现二叉搜索树的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python实现二叉搜索树的方法有哪些

这篇文章主要介绍“python实现二叉搜索树的方法有哪些”,在日常操作中,相信很多人在Python实现二叉搜索树的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python实现二叉搜索树的方法有哪些”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

树的介绍

树不同于链表或哈希表,是一种非线性数据结构,树分为二叉树、二叉搜索树、B树、B+树、红黑树等等。

树是一种数据结构,它是由n个有限节点组成的一个具有层次关系的集合。用图片来表示的话,可以看到它很像一棵倒挂着的树。因此我们将这类数据结构统称为树,树根在上面,树叶在下面。一般的树具有以下特点:

  • 每个节点有0个或者多个子节点

  • 没有父节点的节点被称为根节点

  • 每个非根节点有且只有一个父节点

  • 每个子结点都可以分为多个不相交的子树

二叉树的定义是:每个节点最多有两个子节点。即每个节点只能有以下四种情况:

  • 左子树和右子树均为空

  • 只存在左子树

  • 只存在右子树

  • 左子树和右子树均存在

二叉搜索树

二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:

  • 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值

  • 它的左右子树也分别为二叉搜索树

列举几种Python中几种常见的实现方式:

1.使用类和递归函数实现

通过定义一个节点类,包含节点值、左右子节点等属性,然后通过递归函数实现插入、查找、删除等操作。代码示例如下:

class node:    def __init__(self, data):        self.data = data        self.left = None        self.right = Noneclass BST:    def __init__(self):        self.root = None    def insert(self, value):        if self.root is None:            self.root = Node(value)        else:            self._insert(value, self.root)    def _insert(self, value, node):        if value < node.data:            if node.left is None:                node.left = Node(value)            else:                self._insert(value, node.left)        elif value > node.data:            if node.right is None:                node.right = Node(value)            else:                self._insert(value, node.right)    def search(self, value):        if self.root is None:            return False        else:            return self._search(value, self.root)    def _search(self, value, node):        if node is None:            return False        elif node.data == value:            return True        elif value < node.data:            return self._search(value, node.left)        else:            return self._search(value, node.right)    def delete(self, value):        if self.root is None:            return False        else:            self.root = self._delete(value, self.root)    def _delete(self, value, node):        if node is None:            return node        elif value < node.data:            node.left = self._delete(value, node.left)        elif value > node.data:            node.right = self._delete(value, node.right)        else:            if node.left is None and node.right is None:                del node                return None            elif node.left is None:                temp = node.right                del node                return temp            elif node.right is None:                temp = node.left                del node                return temp            else:                temp = self._find_min(node.right)                node.data = temp.data                node.right = self._delete(temp.data, node.right)        return node    def _find_min(self, node):        while node.left is not None:            node = node.left        return node

2.使用列表实现

通过使用一个列表来存储二叉搜索树的元素,然后通过列表中元素的位置关系来实现插入、查找、删除等操作。代码示例如下:

class BST:    def __init__(self):        self.values = []    def insert(self, value):        if len(self.values) == 0:            self.values.append(value)        else:            self._insert(value, 0)    def _insert(self, value, index):        if value < self.values[index]:            left_child_index = 2 * index + 1            if left_child_index >= len(self.values):                self.values.extend([None] * (left_child_index - len(self.values) + 1))            if self.values[left_child_index] is None:                self.values[left_child_index] = value            else:                self._insert(value, left_child_index)        else:            right_child_index = 2 * index + 2            if right_child_index >= len(self.values):                self.values.extend([None] * (right_child_index - len(self.values) + 1))            if self.values[right_child_index] is None:                self.values[right_child_index] = value            else:                self._insert(value, right_child_index)    def search(self, value):        if value in self.values:            return True        else:            return False    def delete(self, value):        if value not in self.values:            return False        else:            index = self.values.index(value)            self._delete(index)            return True    def _delete(self, index):        left_child_index = 2 * index + 1        right_child_index = 2 * index + 2        if left_child_index < len(self.values) and self.values[left_child_index] is not None:            self._delete(left_child_index)        if right_child_index < len(self.values) and self.values[right_child_index] is not None:            self

3.使用字典实现

其中字典的键表示节点值,字典的值是一个包含左右子节点的字典。代码示例如下:

def insert(tree, value):    if not tree:        return {value: {}}    elif value < list(tree.keys())[0]:        tree[list(tree.keys())[0]] = insert(tree[list(tree.keys())[0]], value)    else:        tree[list(tree.keys())[0]][value] = {}    return treedef search(tree, value):    if not tree:        return False    elif list(tree.keys())[0] == value:        return True    elif value < list(tree.keys())[0]:        return search(tree[list(tree.keys())[0]], value)    else:        return search(tree[list(tree.keys())[0]].get(value), value)def delete(tree, value):    if not search(tree, value):        return False    else:        if list(tree.keys())[0] == value:            if not tree[list(tree.keys())[0]]:                del tree[list(tree.keys())[0]]            elif len(tree[list(tree.keys())[0]]) == 1:                tree[list(tree.keys())[0]] = list(tree[list(tree.keys())[0]].values())[0]            else:                min_key = min(list(tree[list(tree.keys())[0]+1].keys()))                tree[min_key] = tree[list(tree.keys())[0]+1][min_key]                tree[min_key][list(tree.keys())[0]] = tree[list(tree.keys())[0]]                del tree[list(tree.keys())[0]]        elif value < list(tree.keys())[0]:            tree[list(tree.keys())[0]] = delete(tree[list(tree.keys())[0]], value)        else:            tree[list(tree.keys())[0]][value] = delete(tree[list(tree.keys())[0]].get(value), value)    return tree

由于字典是无序的,因此该实现方式可能会导致二叉搜索树不平衡,影响插入、查找和删除操作的效率。

4.使用堆栈实现

使用堆栈(Stack)可以实现一种简单的二叉搜索树,可以通过迭代方式实现插入、查找、删除等操作。具体实现过程如下:

  • 定义一个节点类,包含节点值、左右子节点等属性。

  • 定义一个堆栈,初始时将根节点入栈。

  • 当栈不为空时,取出栈顶元素,并对其进行操作:如果要插入的值小于当前节点值,则将要插入的值作为左子节点插入,并将左子节点入栈;如果要插入的值大于当前节点值,则将要插入的值作为右子节点插入,并将右子节点入栈;如果要查找或删除的值等于当前节点值,则返回或删除该节点。

  • 操作完成后,继续从堆栈中取出下一个节点进行操作,直到堆栈为空。

需要注意的是,在这种实现方式中,由于使用了堆栈来存储遍历树的过程,因此可能会导致内存占用较高。另外,由于堆栈的特性,这种实现方式只能支持深度优先遍历(Depth-First Search,DFS),不能支持广度优先遍历(Breadth-First Search,BFS)。

以下是伪代码示例:

class Node:    def __init__(self, data):        self.data = data        self.left = None        self.right = Nonedef insert(root, value):    if not root:        return Node(value)    stack = [root]    while stack:        node = stack.pop()        if value < node.data:            if node.left is None:                node.left = Node(value)                break            else:                stack.append(node.left)        elif value > node.data:            if node.right is None:                node.right = Node(value)                break            else:                stack.append(node.right)def search(root, value):    stack = [root]    while stack:        node = stack.pop()        if node.data == value:            return True        elif value < node.data and node.left:            stack.append(node.left)        elif value > node.data and node.right:            stack.append(node.right)    return Falsedef delete(root, value):    if root is None:        return None    if value < root.data:        root.left = delete(root.left, value)    elif value > root.data:        root.right = delete(root.right, value)    else:        if root.left is None:            temp = root.right            del root            return temp        elif root.right is None:            temp = root.left            del root            return temp        else:            temp = root.right            while temp.left is not None:                temp = temp.left            root.data = temp.data            root.right = delete(root.right, temp.data)    return root

到此,关于“python实现二叉搜索树的方法有哪些”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: python实现二叉搜索树的方法有哪些

本文链接: https://www.lsjlt.com/news/357022.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python实现二叉搜索树的方法有哪些
    这篇文章主要介绍“python实现二叉搜索树的方法有哪些”,在日常操作中,相信很多人在python实现二叉搜索树的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python实现二叉搜索树的方法有哪些...
    99+
    2023-07-06
  • Python实现二叉搜索树
    二叉搜索树 我们已经知道了在一个集合中获取键值对的两种不同的方法。回忆一下这些集合是如何实现ADT(抽象数据类型)MAP的。我们讨论两种ADT MAP的实现方式,基于列表的二分查找和哈希表。在这一节中,我...
    99+
    2022-06-04
    Python
  • python实现二叉搜索树的四种方法
    目录树的介绍二叉搜索树列举几种Python中几种常见的实现方式:1.使用类和递归函数实现2.使用列表实现3.使用字典实现4.使用堆栈实现树的介绍 树不同于链表或哈希表,是一种非线性数...
    99+
    2023-05-15
    python 二叉搜索树
  • C++二叉搜索树的操作有哪些
    本文小编为大家详细介绍“C++二叉搜索树的操作有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++二叉搜索树的操作有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。二叉搜索树概念与操作二叉搜索树的概念二...
    99+
    2023-06-29
  • Python二叉搜索树与双向链表转换实现方法
    本文实例讲述了Python二叉搜索树与双向链表实现方法。分享给大家供大家参考,具体如下: # encoding=utf8 ''' 题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。 要求...
    99+
    2022-06-04
    双向 链表 方法
  • Java二叉搜索树与数组查找的方法
    本篇内容介绍了“Java二叉搜索树与数组查找的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!题目一 解法class ...
    99+
    2023-06-29
  • 【C++】平衡二叉搜索树的模拟实现
    🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘。 ...
    99+
    2023-09-11
    c++ 开发语言
  • C++实现LeetCode(96.独一无二的二叉搜索树)
    [LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树 Given n, how many structurally un...
    99+
    2022-11-12
  • C++实现LeetCode(95.独一无二的二叉搜索树之二)
    [LeetCode] 95. Unique Binary Search Trees II 独一无二的二叉搜索树之二 Given an integer n, generate...
    99+
    2022-11-12
  • C++使用LeetCode实现独一无二的二叉搜索树
    这篇文章主要介绍C++使用LeetCode实现独一无二的二叉搜索树,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完![LeetCode] 96. Unique Binary Search Trees 独一无二的二叉搜索树...
    99+
    2023-06-20
  • C++数据结构之搜索二叉树的实现
    目录零.前言1.概念2.作用3.迭代实现(1)查找(2)插入(3)删除4.递归实现(1)查找(2)插入(3)删除5.key/value模型的应用(1)对应查找(2)判断出现次数6.总...
    99+
    2022-11-13
  • Python实现二叉树结构与进行二叉树遍历的方法详解
    二叉树的建立 使用类的形式定义二叉树,可读性更好 class BinaryTree: def __init__(self, root): self.key = root sel...
    99+
    2022-06-04
    二叉树 遍历 详解
  • C语言实现二叉搜索树的完整总结
    目录1、 二叉树的构建2、二叉树的遍历前序遍历中序遍历后序遍历层序遍历4、二叉树的高度5、二叉树的删除6、由几种遍历序列还原二叉树 前序序列、中序序列还原二叉树:中序序列、...
    99+
    2022-11-12
  • Java实现二叉搜索树的插入、删除功能
    二叉树的结构 public class TreeNode { int val; TreeNode left; TreeNode rig...
    99+
    2022-11-12
  • python中有哪些类型的二叉树
    python中有哪些类型的二叉树?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。python的五大特点是什么python的五大特点:1.简单易学,开发程序时,专注的是解决问题...
    99+
    2023-06-14
  • Java创建二叉搜索树,实现搜索,插入,删除的操作实例
    Java实现的二叉搜索树,并实现对该树的搜索,插入,删除操作(合并删除,复制删除)首先我们要有一个编码的思路,大致如下: 1、查找:根据二叉搜索树的数据特点,我们可以根据节点的值得比较来实现查找,查找值大于当前节点时向右走,反之向左走!2、...
    99+
    2023-05-30
    java 二叉搜索树 搜索
  • C++实现LeetCode(108.将有序数组转为二叉搜索树)
    [LeetCode] 108.Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树 Given an array wher&...
    99+
    2022-11-12
  • C++实现LeetCode(109.将有序链表转为二叉搜索树)
    [LeetCode] 109.Convert Sorted List to Binary Search Tree 将有序链表转为二叉搜索树 Given a singly linked...
    99+
    2022-11-12
  • C++数据结构之二叉搜索树的实现详解
    目录前言介绍实现节点的实现二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除总结前言 今天我们来学一个新的数据结构:二叉搜索树。 介绍 二叉搜索树也称作二叉排序树,它具有以下性质: 非...
    99+
    2022-11-13
  • C++ AVLTree高度平衡的二叉搜索树怎么实现
    这篇“C++ AVLTree高度平衡的二叉搜索树怎么实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++&nb...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作