欢迎访问宙启技术站
智能推送

使用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为二叉搜索树中节点的个数。因此,二叉搜索树常常被用于需要快速查找、插入、删除操作的场景。