📜  门| GATE 2017 模拟 |第 65 题(1)

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

门 | GATE 2017 模拟 | 第 65 题

这是一道GATE模拟题目,是一个算法题,要求编写一个程序实现二叉搜索树的插入和删除操作,并输出删除的节点的值。

题目描述

给定一个二叉搜索树,请你在其中增加新的节点,并删除一个存在的节点,输出删除节点的值。如果删除的节点有两个子节点,则用右子树的最小节点替换该节点。

代码实现
class Node:
    def __init__(self, val=None):
        self.val = val
        self.left = None
        self.right = None


def insert(root, val):
    if root is None:
        return Node(val)
    else:
        if root.val == val:
            return root
        elif val < root.val:
            root.left = insert(root.left, val)
        else:
            root.right = insert(root.right, val)
        return root


def delete(root, val):
    if root is None:
        return root
    elif val < root.val:
        root.left = delete(root.left, val)
        return root
    elif val > root.val:
        root.right = delete(root.right, val)
        return root
    else:
        if root.left is None and root.right is None:
            root = None
            return root
        elif root.left is None:
            temp = root
            root = root.right
            del temp
            return root
        elif root.right is None:
            temp = root
            root = root.left
            del temp
            return root
        else:
            curr_node = root.right
            while curr_node.left:
                curr_node = curr_node.left
            root.val = curr_node.val
            root.right = delete(root.right, curr_node.val)
            return root
解释说明

这里采用了Python语言实现,定义了一个Node类,表示二叉搜索树的一个节点。

insert()方法用于插入节点,它接受一个根节点和一个待插入的值。若根节点为None,则新建一个节点作为根节点,并将值赋给它。否则,如果待插入的值等于根节点的值,则返回根节点本身。如果待插入的值小于根节点的值,则递归调用insert()方法,将根节点的左子树作为根节点,待插入的值作为参数。如果待插入的值大于根节点的值,则递归调用insert()方法,将根节点的右子树作为根节点,待插入的值作为参数。最后,返回根节点。

delete()方法用于删除节点,它接受一个根节点和待删除的值。如果根节点为None,则直接返回根节点。如果待删除的值小于根节点的值,则递归调用delete()方法,将根节点的左子树作为根节点,待删除的值作为参数。如果待删除的值大于根节点的值,则递归调用delete()方法,将根节点的右子树作为根节点,待删除的值作为参数。如果待删除的值等于根节点的值,则开始进行删除操作。如果该节点既没有左子树也没有右子树,则将它设置为None即可。如果该节点只有左子树或右子树,则将该节点的左子树/右子树作为新的根节点。如果该节点既有左子树也有右子树,则用右子树的最小节点替换该节点,然后删除右子树的最小节点。最后,返回根节点。

总结

这道题涉及了二叉搜索树的插入和删除操作,如果对二叉搜索树的基本概念和原理不熟悉的话,可能会比较难理解。不过,通过逐步分析代码的实现,我们可以领略到二叉搜索树的精髓之处。