📜  数据结构 |二叉搜索树 |问题2(1)

📅  最后修改于: 2023-12-03 14:54:56.068000             🧑  作者: Mango

数据结构 | 二叉搜索树 | 问题2

介绍

二叉搜索树是一种常见的树形数据结构,它是在树的基础上增加了一些特殊的性质。具体而言,二叉搜索树的每个节点都包含一个键值,键值的大小关系满足左小右大的原则。

问题2是对二叉搜索树的操作之一,需要在二叉搜索树中查找一个节点,如果该节点存在,则删除它并返回删除后的树,如果该节点不存在,则不做任何操作。

实现

首先,我们需要定义二叉搜索树的节点类,它包含三个属性:键值key、左子节点left和右子节点right

class Node:
    def __init__(self, key):
        self.key = key
        self.left = None
        self.right = None

接下来,我们定义二叉搜索树的类。它包含一个属性root,表示树的根节点。我们需要在这个类中实现两个方法insertdelete,分别用于在树中插入一个节点和删除一个节点。

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

    def insert(self, key):
        if not self.root:
            self.root = Node(key)
        else:
            self._insert(key, self.root)

    def _insert(self, key, node):
        if key < node.key:
            if node.left:
                self._insert(key, node.left)
            else:
                node.left = Node(key)
        else:
            if node.right:
                self._insert(key, node.right)
            else:
                node.right = Node(key)

    def delete(self, key):
        if not self.root:
            return None
        else:
            self.root = self._delete(key, self.root)
            return self.root

    def _delete(self, key, node):
        if not node:
            return None
        else:
            if key == node.key:
                if not node.left and not node.right:
                    node = None
                elif not node.left:
                    node = node.right
                elif not node.right:
                    node = node.left
                else:
                    min_node = self._find_min(node.right)
                    node.key = min_node.key
                    node.right = self._delete(min_node.key, node.right)
            elif key < node.key:
                node.left = self._delete(key, node.left)
            else:
                node.right = self._delete(key, node.right)
            return node

    def _find_min(self, node):
        if node.left:
            return self._find_min(node.left)
        else:
            return node

其中,_insert方法是一个递归方法,用于在二叉搜索树中插入一个新的节点。_delete方法同样是一个递归方法,用于删除二叉搜索树中的一个节点。如果节点有两个子节点,则需要找到右子树中的最小节点来替代当前节点。

测试

下面是一个测试程序,用于验证上述代码的正确性。

bst = BinarySearchTree()

bst.insert(5)
bst.insert(3)
bst.insert(7)
bst.insert(1)
bst.insert(9)
bst.insert(4)
bst.insert(2)
bst.insert(6)
bst.insert(8)

bst.delete(5)

print(bst.root.key)  # 输出6

我们先创建一个二叉搜索树,并插入一些节点。然后,我们删除根节点,并打印出删除后的根节点的值。由于删除节点5时,找到右子树中的最小节点6替代了5,所以打印出的结果为6,证明了我们的代码的正确性。

总结

二叉搜索树是一种常用的数据结构,它可以支持快速查找、插入、删除等操作。本文介绍了如何实现二叉搜索树的节点类和树类,并用具体的例子演示了如何在二叉搜索树中删除一个节点。