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

如何用Python中的函数实现二叉搜索树的操作?

发布时间:2023-06-27 02:31:24

二叉搜索树是一种常见的数据结构,它是一棵二叉树,其中每个节点都比其左子树的所有节点的值大,比其右子树的所有节点的值小。因此,它可以实现快速的查找、插入和删除操作。 在Python中,我们可以使用Node类和一些函数来实现二叉搜索树的操作。

首先,我们需要定义Node类,每个节点包含一个值和两个指针(left和right)指向其左右子树。如下所示:

class Node:

    def __init__(self, val):

        self.val = val

        self.left = None

        self.right = None

接下来,我们需要实现插入操作。插入操作的基本思想是从根节点开始遍历树,在找到一个合适的位置之后插入新节点。如下所示:

def insert(root, val):

    if not root:

        return Node(val)

    if val < root.val:

        root.left = insert(root.left, val)

    else:

        root.right = insert(root.right, val)

    return root

其中,如果根节点为空,就直接返回插入的新节点。否则,如果要插入的值小于当前节点的值,就从当前节点的左子树继续递归插入,否则从右子树继续递归插入。最后返回根节点。

接着,我们需要实现查找操作。查找操作的基本思想是从根节点开始遍历树,找到与目标值相等的节点。如下所示:

def search(root, val):

    if not root:

        return None

    if root.val == val:

        return root

    elif val < root.val:

        return search(root.left, val)

    else:

        return search(root.right, val)

其中,如果根节点为空,就返回None。如果根节点的值与目标值相等,就直接返回根节点。否则,如果目标值小于当前节点的值,就从当前节点的左子树继续递归查找,否则从右子树继续递归查找。最后返回找到的节点或None。

最后,我们需要实现删除操作。删除操作比插入和查找操作要稍微复杂一些,因为需要考虑删除节点的位置和子树的连接情况。删除操作可以分为三种情况:

1. 被删除节点没有子节点。直接将其父节点的指针指向None即可。

def delete(root, val):

    if not root:

        return root

    if root.val == val:

        if not root.left and not root.right:

            return None

        elif not root.left:

            return root.right

        elif not root.right:

            return root.left

2. 被删除节点只有一个子节点。直接将其父节点的指针指向其子节点即可。

def delete(root, val):

    if not root:

        return root

    if root.val == val:

        if not root.left and not root.right:

            return None

        elif not root.left:

            return root.right

        elif not root.right:

            return root.left

        else:

            temp = root.right

            while temp.left:

                temp = temp.left

            root.val = temp.val

            root.right = delete(root.right, temp.val)

    elif val < root.val:

        root.left = delete(root.left, val)

    else:

        root.right = delete(root.right, val)

    return root

其中,如果被删除节点只有左子树,就直接返回左子树;如果只有右子树,就返回右子树;如果两边都有子树,就找到其右子树的最小节点,将其值赋给被删除节点,再递归删除右子树中的最小节点。

3. 被删除节点有两个子节点。需要先找到其右子树中的最小节点,将其值赋给被删除节点,再递归删除右子树中的最小节点。

def delete(root, val):

    if not root:

        return root

    if root.val == val:

        if not root.left and not root.right:

            return None

        elif not root.left:

            return root.right

        elif not root.right:

            return root.left

        else:

            temp = root.right

            while temp.left:

                temp = temp.left

            root.val = temp.val

            root.right = delete(root.right, temp.val)

    elif val < root.val:

        root.left = delete(root.left, val)

    else:

        root.right = delete(root.right, val)

    return root

至此,我们就完成了二叉搜索树的插入、查找和删除操作。我们可以创建一个根节点,然后不断地插入、查找、删除节点,测试程序的正确性。