当前位置:首页python > 正文

Python 数据结构:二叉搜索树(BST)删除操作

作者:野牛程序员:2025-12-22 11:08:49python阅读 2003
Python 数据结构:二叉搜索树(BST)删除操作
# /*
# Python 数据结构:二叉搜索树(BST)删除操作
# --------------------------------------------------------
# 概念:
# 删除操作分三种情况:
# 1) 删除叶子节点:直接删除即可
# 2) 删除只有一个子节点的节点:用子节点替代
# 3) 删除有两个子节点的节点:用右子树最小值(或左子树最大值)替代,然后删除替代节点
# */

# ========================================================
# BST 节点定义
# ========================================================
class BSTNode:
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None

# ========================================================
# BST 操作类(插入 + 查找 + 删除)
# ========================================================
class BST:
    def __init__(self):
        self.root = None

    # 插入节点
    def insert(self, data):
        self.root = self._insert_recursive(self.root, data)

    def _insert_recursive(self, node, data):
        if node is None:
            return BSTNode(data)
        if data < node.data:
            node.left = self._insert_recursive(node.left, data)
        elif data > node.data:
            node.right = self._insert_recursive(node.right, data)
        return node

    # 查找节点
    def search(self, target):
        return self._search_recursive(self.root, target)

    def _search_recursive(self, node, target):
        if node is None:
            return False
        if target == node.data:
            return True
        elif target < node.data:
            return self._search_recursive(node.left, target)
        else:
            return self._search_recursive(node.right, target)

    # 删除节点
    def delete(self, key):
        self.root = self._delete_recursive(self.root, key)

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

        if key < node.data:
            node.left = self._delete_recursive(node.left, key)
        elif key > node.data:
            node.right = self._delete_recursive(node.right, key)
        else:
            # 找到节点,执行删除
            # 情况1:叶子节点或只有一个子节点
            if node.left is None:
                return node.right
            elif node.right is None:
                return node.left
            # 情况2:有两个子节点
            min_larger_node = self._find_min(node.right)
            node.data = min_larger_node.data
            node.right = self._delete_recursive(node.right, min_larger_node.data)
        return node

    # 找右子树最小节点
    def _find_min(self, node):
        while node.left:
            node = node.left
        return node

    # 中序遍历(升序)
    def inorder_traversal(self, node=None):
        if node is None:
            node = self.root
        result = []
        def _inorder(n):
            if n:
                _inorder(n.left)
                result.append(n.data)
                _inorder(n.right)
        _inorder(node)
        return result

# ========================================================
# 示例演示
# ========================================================
bst = BST()
for value in [50, 30, 70, 20, 40, 60, 80]:
    bst.insert(value)

print("初始中序遍历:", bst.inorder_traversal())

# 删除叶子节点
bst.delete(20)
print("删除叶子节点 20 后:", bst.inorder_traversal())

# 删除只有一个子节点的节点
bst.delete(30)
print("删除节点 30(只有一个子节点)后:", bst.inorder_traversal())

# 删除有两个子节点的节点
bst.delete(50)
print("删除节点 50(有两个子节点)后:", bst.inorder_traversal())

# ========================================================
# 要点总结:
# --------------------------------------------------------
# 1) BST 删除根据节点情况分三类:叶子、单子节点、双子节点;
# 2) 双子节点删除可用右子树最小节点替代或左子树最大节点替代;
# 3) 删除操作保持 BST 特性不变;
# 4) 时间复杂度平均为 O(log n),最坏为 O(n);
# 5) 删除后可通过中序遍历验证 BST 正确性。
# */
#
# 初始中序遍历:
# [20, 30, 40, 50, 60, 70, 80]
# 删除叶子节点 20 后:
# [30, 40, 50, 60, 70, 80]
# 删除节点 30(只有一个子节点)后:
# [40, 50, 60, 70, 80]
# 删除节点 50(有两个子节点)后:
# [40, 60, 70, 80]


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • Python 数据结构:二叉搜索树(BST)删除操作
  • 相关推荐

    最新推荐

    热门点击