使用Python实现二叉搜索树
发布时间:2023-12-04 21:41:16
二叉搜索树(Binary Search Tree,BST)是一种特殊的二叉树,它的每个节点最多有两个子节点,并且满足以下性质:
1. 左子树上的所有节点的值都小于根节点的值。
2. 右子树上的所有节点的值都大于根节点的值。
3. 左右子树也必须是二叉搜索树。
下面是使用Python实现一个简单的二叉搜索树的例子:
# 定义一个节点类
class Node:
def __init__(self, key):
self.left = None
self.right = None
self.key = key
# 定义二叉搜索树类
class BinarySearchTree:
def __init__(self):
self.root = None
# 插入节点
def insert(self, key):
if self.root is None:
self.root = Node(key)
else:
self._insert(self.root, key)
def _insert(self, node, key):
if node is None:
return Node(key)
if key < node.key:
node.left = self._insert(node.left, key)
elif key > node.key:
node.right = self._insert(node.right, key)
return node
# 删除节点
def delete(self, key):
self.root = self._delete(self.root, key)
def _delete(self, node, key):
if node is None:
return node
if key < node.key:
node.left = self._delete(node.left, key)
elif key > node.key:
node.right = self._delete(node.right, key)
else:
if node.left is None:
return node.right
elif node.right is None:
return node.left
else:
min_node = self._find_min(node.right)
node.key = min_node.key
node.right = self._delete(node.right, min_node.key)
return node
def _find_min(self, node):
while node.left is not None:
node = node.left
return node
# 查找节点
def search(self, key):
return self._search(self.root, key)
def _search(self, node, key):
if node is None or node.key == key:
return node
if key < node.key:
return self._search(node.left, key)
else:
return self._search(node.right, key)
# 中序遍历
def inorder(self):
self._inorder(self.root)
def _inorder(self, node):
if node is not None:
self._inorder(node.left)
print(node.key)
self._inorder(node.right)
# 创建二叉搜索树
bst = BinarySearchTree()
# 插入节点
bst.insert(8)
bst.insert(3)
bst.insert(10)
bst.insert(1)
bst.insert(6)
# 中序遍历
bst.inorder() # 输出:1, 3, 6, 8, 10
# 查找节点
print(bst.search(6)) # 输出:6
# 删除节点
bst.delete(3)
# 中序遍历
bst.inorder() # 输出:1, 6, 8, 10
在上面的代码中,我们首先定义了一个节点类Node,它有三个属性:left(左子节点)、right(右子节点)和key(节点的值)。
然后定义了二叉搜索树类BinarySearchTree,它有一个属性root(根节点)。我们实现了插入节点、删除节点、查找节点、以及中序遍历的功能。
我们使用例子创建了一个二叉搜索树bst,插入了一些节点,并进行了中序遍历,最后删除了一个节点,并再次进行了中序遍历。
通过以上的例子,我们可以看到二叉搜索树的插入、删除、查找等操作都比较简单高效,这些操作的时间复杂度都是O(log n),其中n为二叉搜索树中节点的个数。因此,二叉搜索树常常被用于需要快速查找、插入、删除操作的场景。
