📜  使二进制搜索树(1)

📅  最后修改于: 2023-12-03 15:36:25.943000             🧑  作者: Mango

使二进制搜索树

什么是二进制搜索树?

二进制搜索树,也叫二叉搜索树,是一种数据结构,它是一个二叉树,其中每个节点都包含一个键(key)和一个值(value)。节点的左子树包含的所有键都小于该节点的键,而右子树则包含所有大于该节点的键。通过这种方式,树可以快速地进行查找、插入和删除操作。

二进制搜索树的实现

二进制搜索树是一种非常有效的数据结构,可以用来存储大量的数据,因为它可以自动调整自己的结构,从而保证树的平衡性。大多数二叉搜索树的实现都是基于指针的(因为它们需要动态地增加和删除节点)。下面是一个基于指针的二叉搜索树的实现示例:

class Node:
    def __init__(self, key, val):
        self.key = key
        self.val = val
        self.left = None
        self.right = None

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

    def get(self, key):
        return self.get_node(key, self.root)

    def get_node(self, key, node):
        if node is None:
            return None
        if node.key == key:
            return node.val
        elif key < node.key:
            return self.get_node(key, node.left)
        else:
            return self.get_node(key, node.right)

    def put(self, key, val):
        self.root = self.put_node(key, val, self.root)

    def put_node(self, key, val, node):
        if node is None:
            return Node(key, val)
        if node.key == key:
            node.val = val
        elif key < node.key:
            node.left = self.put_node(key, val, node.left)
        else:
            node.right = self.put_node(key, val, node.right)
        return node

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

    def delete_node(self, key, node):
        if node is None:
            return None
        if key < node.key:
            node.left = self.delete_node(key, node.left)
            return node
        elif key > node.key:
            node.right = self.delete_node(key, node.right)
            return node
        else:
            if node.left is None:
                return node.right
            elif node.right is None:
                return node.left
            else:
                tmp = self.min_node(node.right)
                node.key = tmp.key
                node.val = tmp.val
                node.right = self.delete_node(node.key, node.right)
                return node

    def min_node(self, node):
        while node.left is not None:
            node = node.left
        return node
二叉搜索树的应用

二叉搜索树是一种非常通用的数据结构,可以用于解决各种问题,如排序、查找、最小/最大元素、下一个最大/最小元素等。下面是一些二叉搜索树应用的示例:

排序

二叉搜索树可以用于排序一个数组。它的基本思路是将数据插入二叉搜索树,然后遍历整个树,将元素输出到一个数组中。下面是一个用于排序的函数:

def sort(arr):
    bst = BinarySearchTree()
    for i in arr:
        bst.put(i, i)
    sorted_arr = []
    for i in bst:
        sorted_arr.append(i)
    return sorted_arr
查找元素

二叉搜索树可以很方便地查找具有给定键的元素。下面是一个用于查找元素的函数:

def find_element(bst, key):
    return bst.get(key)
查找最小元素和最大元素

二叉搜索树中最小的元素是最左边的节点,而最大的元素是最右边的节点。下面是一个用于查找最小元素和最大元素的函数:

def find_min(bst):
    node = bst.root
    while node.left is not None:
        node = node.left
    return node

def find_max(bst):
    node = bst.root
    while node.right is not None:
        node = node.right
    return node
下一个最大/最小元素

二叉搜索树中,给定一个节点,可以很容易地找到下一个最大或最小的节点。下面是一个用于查找后继和前驱节点的函数:

def find_successor(node):
    if node.right is not None:
        return find_min(node.right)
    else:
        while node.parent is not None and node.parent.right == node:
            node = node.parent
        return node.parent

def find_predecessor(node):
    if node.left is not None:
        return find_max(node.left)
    else:
        while node.parent is not None and node.parent.left == node:
            node = node.parent
        return node.parent
总结

二叉搜索树是一种非常优秀的数据结构,它能够非常高效地进行查找、插入和删除操作。因此,它被广泛应用于各种领域,如数据库、操作系统和编译器等。在实际应用中,要注意维护二叉搜索树的平衡性,以保证它的效率。