📜  数据结构示例-构造一个二叉搜索树并执行删除和有序遍历(1)

📅  最后修改于: 2023-12-03 15:26:09.809000             🧑  作者: Mango

数据结构示例-构造一个二叉搜索树并执行删除和有序遍历

在计算机科学中,二叉搜索树是一种数据结构,用于维护一组有序的元素。它既支持快速的插入元素,又支持快速的删除元素和有序遍历元素。

构造一个二叉搜索树

下面是用Python代码实现构造一个二叉搜索树的例子:

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

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

    def insert(self, val):
        # 如果树为空,则新节点为根节点
        if self.root is None:
            self.root = Node(val)
            return

        # 否则,从根节点开始搜索合适的插入位置
        cur = self.root
        while cur:
            if val < cur.val:
                if cur.left:
                    cur = cur.left
                else:
                    cur.left = Node(val)
                    break
            elif val > cur.val:
                if cur.right:
                    cur = cur.right
                else:
                    cur.right = Node(val)
                    break
            else:
                # 如果待插入的值已存在则跳过
                break

这里定义了一个Node类表示树的节点,以及一个BinarySearchTree类表示二叉搜索树。BinarySearchTree类中定义了一个insert方法,用于向树中插入新的元素。

需要说明的是,在上面的代码中,对于已存在于树中的元素,insert方法实际上不会进行任何操作。

二叉搜索树的有序遍历

二叉搜索树的有序遍历(in-order traversal)是指将树中的元素按照从小到大的顺序输出。下面是Python代码实现的例子:

class BinarySearchTree:
    # ...

    def inorder_traversal(self):
        def visit(node):
            if node:
                visit(node.left)
                print(node.val)
                visit(node.right)

        visit(self.root)

这里使用了递归的方式实现,将visit方法当做小函数,在函数内部再递归调用自己。首先向左子树递归调用,然后输出当前节点的值,最后向右子树递归调用。

二叉搜索树的删除元素

二叉搜索树的删除元素看起来比插入要复杂一些。直接将某个节点删除之后,如果不对后续过程做出调整,则可能会破坏二叉搜索树的有序性。下面是Python代码实现的例子:

class BinarySearchTree:
    # ...

    def delete(self, val):
        def _delete(node, val):
            if node is None:
                return None

            if val < node.val:
                node.left = _delete(node.left, val)
            elif val > node.val:
                node.right = _delete(node.right, val)
            else:
                if node.left is None:
                    return node.right
                elif node.right is None:
                    return node.left
                else:
                    p = node.right
                    while p.left:
                        p = p.left
                    node.val = p.val
                    node.right = _delete(node.right, p.val)

            return node

        self.root = _delete(self.root, val)

在上面的代码中,定义了一个名为_delete的递归函数,用于在树中删除指定值的节点。如果找到了待删除的节点,需要根据其子节点的情况进行调整。如果待删除节点没有子节点,则可以直接删除。如果待删除节点只有一个子节点,则需要将其父节点指向待删除节点的子节点。如果待删除节点既有左子节点,又有右子节点,则需要寻找其右子树中的最小节点来代替当前节点,从而保持二叉搜索树的有序性。

总结

本文介绍了如何构造一个二叉搜索树,并实现了有序遍历和元素删除操作。二叉搜索树是一种重要的数据结构,在实际应用中广泛使用。熟练掌握它的构造和操作方法,可以增强编程的能力,提高编码效率。