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

在Python中实现二叉搜索树的插入、查找及删除操作

发布时间:2023-06-12 13:51:01

二叉搜索树是一种常用的数据结构,它以一种有序的方式存储数据,可以快速地进行插入、查找和删除操作。在Python中,我们可以使用类的形式来实现二叉搜索树。

首先,我们定义一个类TreeNode,它包含了二叉搜索树的基本节点结构:左右子树和节点值。代码如下:

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

接着,我们定义一个二叉搜索树类BST,它包含了二叉搜索树的插入、查找和删除操作。代码如下:

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

    def insert(self, val):
        if not self.root:
            self.root = TreeNode(val)
        else:
            self._insert(val, self.root)

    def _insert(self, val, node):
        if val < node.val:
            if node.left is None:
                node.left = TreeNode(val)
            else:
                self._insert(val, node.left)
        else:
            if node.right is None:
                node.right = TreeNode(val)
            else:
                self._insert(val, node.right)

    def search(self, val):
        return self._search(val, self.root)

    def _search(self, val, node):
        if not node:
            return False
        elif node.val == val:
            return True
        elif val < node.val:
            return self._search(val, node.left)
        else:
            return self._search(val, node.right)

    def delete(self, val):
        self.root = self._delete(val, self.root)

    def _delete(self, val, node):
        if not node:
            return node
        elif val < node.val:
            node.left = self._delete(val, node.left)
        elif val > node.val:
            node.right = self._delete(val, node.right)
        else:
            # Case 1: No child
            if not node.left and not node.right:
                node = None
            # Case 2: One child
            elif not node.left:
                node = node.right
            elif not node.right:
                node = node.left
            # Case 3: Two children
            else:
                temp = self._find_min(node.right)
                node.val = temp.val
                node.right = self._delete(temp.val, node.right)
        return node

    def _find_min(self, node):
        while node.left:
            node = node.left
        return node

在BST类中,我们使用了私有方法(以“_”开头)来进行递归操作,其中:

- insert()方法用于插入新节点,如果二叉搜索树还没有根节点,则直接将其插入为根节点。否则,我们将其插入到左子树或右子树中,直到找到合适的节点。

- search()方法用于查找节点,如果找到,则返回True,否则返回False。

- delete()方法用于删除节点,我们使用三种情况对底层的节点进行删除操作:1.节点为叶子节点;2.节点只有一个子节点;3.节点有两个子节点。我们使用_find_min()方法来找到要删除节点右子树的最小节点,并将其值复制给要删除的节点。

下面我们来测试一下这个二叉搜索树的实现:

bst = BST()
bst.insert(5)
bst.insert(3)
bst.insert(7)
bst.insert(2)
bst.insert(4)
bst.insert(6)
bst.insert(8)

print(bst.search(5))
print(bst.search(2))
print(bst.search(9))
bst.delete(5)
print(bst.search(5))

在上述测试中,我们先插入了一些节点,然后查找了一些值,最后删除了一个节点,并再次查找已删除的节点。输出结果如下:

True
True
False
False

可以看到,我们的实现已经正确地进行插入、查找和删除操作了。