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

Python实现二叉查找树的插入和删除操作

发布时间:2023-12-04 12:32:05

二叉查找树(Binary Search Tree,简称BST)是一种特殊的二叉树,它满足以下性质:

1. 左子树上的所有节点的值都小于根节点的值。

2. 右子树上的所有节点的值都大于根节点的值。

3. 左右子树也分别为二叉查找树。

基于这些性质,我们可以实现二叉查找树的插入和删除操作。

插入操作:

插入操作可以将新节点插入到二叉查找树的合适位置,以保持二叉查找树的性质不变。具体实现步骤如下:

1. 从根节点开始,比较需要插入的节点值与当前节点值的大小关系。

2. 如果需要插入的节点值小于当前节点值,并且当前节点的左子节点为空,则将新节点插入作为当前节点的左子节点。

3. 如果需要插入的节点值小于当前节点值,并且当前节点的左子节点不为空,则将当前节点更新为其左子节点,并重复步骤1。

4. 如果需要插入的节点值大于当前节点值,并且当前节点的右子节点为空,则将新节点插入作为当前节点的右子节点。

5. 如果需要插入的节点值大于当前节点值,并且当前节点的右子节点不为空,则将当前节点更新为其右子节点,并重复步骤1。

6. 如果需要插入的节点值与当前节点值相等,则不插入新节点。

删除操作:

删除操作可以移除二叉查找树中指定值的节点,同时保持二叉查找树的性质不变。具体实现步骤如下:

1. 首先,从根节点开始,找到需要删除的节点。

2. 如果需要删除的节点没有子节点,则直接将其父节点的对应子节点指针置为空即可。

3. 如果需要删除的节点只有一个子节点,则将其子节点连接到其父节点的同一侧。

4. 如果需要删除的节点有两个子节点,则需要找到其右子树中的最小节点(或左子树中的最大节点)来替换要删除的节点。

4.1 首先,找到右子树中的最小节点(或左子树中的最大节点)。

4.2 将右子树中的最小节点的值复制到要删除的节点中。

4.3 将右子树中的最小节点删除。

下面是Python实现上述二叉查找树的插入和删除操作的代码示例:

class TreeNode:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

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

    def insert(self, value):
        if self.root is None:
            self.root = TreeNode(value)
        else:
            self._insert_recursive(self.root, value)

    def _insert_recursive(self, node, value):
        if value < node.value:
            if node.left is None:
                node.left = TreeNode(value)
            else:
                self._insert_recursive(node.left, value)
        elif value > node.value:
            if node.right is None:
                node.right = TreeNode(value)
            else:
                self._insert_recursive(node.right, value)

    def delete(self, value):
        self.root = self._delete_recursive(self.root, value)

    def _delete_recursive(self, node, value):
        if node is None:
            return node

        if value < node.value:
            node.left = self._delete_recursive(node.left, value)
        elif value > node.value:
            node.right = self._delete_recursive(node.right, value)
        else:
            if node.left is None:
                return node.right
            elif node.right is None:
                return node.left
            else:
                min_value = self._find_min_value(node.right)
                node.value = min_value
                node.right = self._delete_recursive(node.right, min_value)

        return node

    def _find_min_value(self, node):
        while node.left is not None:
            node = node.left
        return node.value

# 使用例子
bst = BinarySearchTree()

# 插入操作
bst.insert(5)
bst.insert(3)
bst.insert(7)
bst.insert(2)
bst.insert(4)
bst.insert(6)
bst.insert(8)

# 删除操作
bst.delete(4)
bst.delete(7)

以上代码中,BinarySearchTree类包含了insert和delete方法,分别用于插入和删除操作。插入操作通过递归调用自身实现。删除操作也使用递归,其中_delete_recursive方法用于递归地删除节点。

在使用例子中,我们首先创建了一个二叉查找树对象bst,并对其进行了一系列插入和删除操作。