📅  最后修改于: 2023-12-03 14:49:08.459000             🧑  作者: Mango
BST,也就是二叉搜索树,是一种常见的二叉树,它的每个节点都有一个键值,并且每个节点的左子树的所有键值都小于该节点的键值,而右子树的所有键值都大于该节点的键值。
BST 的插入、删除、查找操作的平均时间复杂度是 logn,最坏时间复杂度是 n,相对于数组的 O(n) 插入、删除操作来说,优势十分明显。
一个 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)。