文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-06 01:06

关注

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

树的介绍

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

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

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

二叉搜索树

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

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

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯