📜  什么是 bst (1)

📅  最后修改于: 2023-12-03 14:49:08.459000             🧑  作者: Mango

什么是 BST

BST,也就是二叉搜索树,是一种常见的二叉树,它的每个节点都有一个键值,并且每个节点的左子树的所有键值都小于该节点的键值,而右子树的所有键值都大于该节点的键值。

为什么要用 BST

BST 的插入、删除、查找操作的平均时间复杂度是 logn,最坏时间复杂度是 n,相对于数组的 O(n) 插入、删除操作来说,优势十分明显。

如何实现 BST
节点的定义

一个 BST 的节点应该至少包含一个键值、左子节点和右子节点三个属性。可以使用类来定义一个 BST 的节点:

class Node:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None
插入操作

BST 的插入操作通常是递归实现的,对于一个给定的键值,如果它小于当前节点的键值,则递归地插入到当前节点的左子树中,如果大于当前节点的键值,则递归地插入到当前节点的右子树中。

def insert(root, key):
    if root is None:
        return Node(key)
    elif key < root.key:
        root.left = insert(root.left, key)
    elif key > root.key:
        root.right = insert(root.right, key)
    return root
删除操作

BST 的删除操作比较复杂,需要考虑多种情况,包括被删除节点是叶节点、被删除节点只有一棵子树、被删除节点有两棵子树等。这里只展示一种情况的代码,即被删除节点没有左子树的情况,其他情况的代码可以自行搜索。

def deleteNode(root, key):
    if root is None:
        return root
    elif key < root.key:
        root.left = deleteNode(root.left, key)
    elif key > root.key:
        root.right = deleteNode(root.right, key)
    else:
        if root.right is None:
            return root.left
        else:
            tmp = root.right
            while tmp.left:
                tmp = tmp.left
            root.key = tmp.key
            root.right = deleteNode(root.right, tmp.key)
    return root
查找操作

BST 的查找操作也是递归实现的,对于一个给定的键值,如果当前节点的键值与之相等,则返回当前节点;如果小于当前节点的键值,则递归地在左子树中查找;如果大于当前节点的键值,则递归地在右子树中查找。

def search(root, key):
    if root is None or root.key == key:
        return root
    elif key < root.key:
        return search(root.left, key)
    else:
        return search(root.right, key)
总结

BST 是一种非常常见且实用的数据结构,可以用来快速地实现插入、删除和查找操作。对于一组有序的数据,将其存储在 BST 中可以使得查找操作更加高效。但是,需要注意的是,如果 BST 退化成链表,那么插入、删除、查找操作的时间复杂度将退化为 O(n)。