📜  门| GATE CS 2021 |套装2 |问题19(1)

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

题目简介

本题来自2021年印度门考试,是套装2中的第19题。该题目考查的是二叉搜索树的删除操作,要求在O(h)的时间复杂度内删除给定元素,并保持二叉搜索树的特性不变。

解题思路

二叉搜索树的删除操作分为三种情况。

情况1:要删除的节点是叶子节点

直接将该节点删除即可。

情况2:要删除的节点只有一个子节点

将要删除的节点的子节点替换到要删除的节点位置即可。

情况3:要删除的节点有两个子节点

将该节点的右子树中最小的节点替换到该节点位置,并将该右子树中最小节点删除。可以用递归实现此操作。

具体实现可以参考如下程序代码:

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None
        
class BST:
    def __init__(self):
        self.root = None
        
    def delete(self, root, key):
        if not root:
            return root
        
        if root.val > key:
            root.left = self.delete(root.left, key)
        elif root.val < key:
            root.right = self.delete(root.right, key)
        else:
            if not root.left:
                temp = root.right
                root = None
                return temp
            elif not root.right:
                temp = root.left
                root = None
                return temp
            
            temp = self.getMin(root.right)
            root.val = temp.val
            root.right = self.delete(root.right, temp.val)
        return root
    
    def getMin(self, node):
        while node and node.left:
            node = node.left
        return node

总结

本题考查的是二叉搜索树的删除操作,需要掌握二叉搜索树的性质以及删除操作的实现方式。对于情况3,需要用到递归实现,需要注意程序的时间复杂度。在实际工作中,二叉搜索树的应用非常广泛,掌握该算法具有重要意义。