PHP前端开发

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

百变鹏仔 1个月前 (01-21) #Python
文章标签 方法

树的介绍

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

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

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

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

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

    立即学习“Python免费学习笔记(深入)”;

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

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

  • 左子树和右子树均为空

  • 只存在左子树

  • 只存在右子树

  • 左子树和右子树均存在

二叉搜索树

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

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

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

列举几种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.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:            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 = 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 &gt;= 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 <h4>3.使用字典实现</h4><p>其中字典的键表示节点值,字典的值是一个包含左右子节点的字典。代码示例如下:</p><pre class="brush:py;">def insert(tree, value):    if not tree:        return {value: {}}    elif value <p>由于字典是无序的,因此该实现方式可能会导致二叉搜索树不平衡,影响插入、查找和删除操作的效率。</p><h4>4.使用堆栈实现</h4><p>使用堆栈(Stack)可以实现一种简单的二叉搜索树,可以通过迭代方式实现插入、查找、删除等操作。具体实现过程如下:</p>
  • 定义一个节点类,包含节点值、左右子节点等属性。

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

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

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

需要注意的是,在这种实现方式中,由于使用了堆栈来存储遍历树的过程,因此可能会导致内存占用较高。另外,由于堆栈的特性,这种实现方式只能支持深度优先遍历(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.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.right:            stack.append(node.right)    return Falsedef delete(root, value):    if root is None:        return None    if 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