📜  门| GATE-CS-2005 |第 63 题(1)

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

题目介绍

本题为 GATE-CS-2005 题库中的第63题,属于计算机科学领域。该题目要求编写一个程序,实现从二叉搜索树中删除节点的操作。程序需满足复杂度为 $O(h)$,其中 $h$ 为树的高度。

解题思路

由于二叉搜索树的特殊性质,为了维持搜索树的有序性,删除节点需要进行一定的调整操作。具体思路如下:

  1. 如果要删除的节点为叶子节点,直接删除即可。
  2. 如果要删除的节点只有一个子节点,将该子节点替换到要删除的节点的位置。
  3. 如果要删除的节点有两个子节点,找到右子树中的最小节点,将该节点替换到要删除的节点的位置。然后,删除右子树中的该最小节点。

以上三种情况均可以通过递归的方式实现。在递归过程中,需要注意保持二叉搜索树的有序性。

实现代码如下:

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

def deleteNode(root, key):
    # 如果树为空,返回None
    if root is None:
        return root
    
    # 递归搜索目标节点
    if key < root.val:
        root.left = deleteNode(root.left, key)
    elif key > root.val:
        root.right = deleteNode(root.right, key)
    else:   # 找到目标节点
        # 情况1:如果目标节点为叶子节点,直接删除
        if root.left is None and root.right is None:
            root = None
        
        # 情况2:如果目标节点只有一个子节点,将该子节点替换目标节点
        elif root.left is None:
            root = root.right
        elif root.right is None:
            root = root.left
        
        # 情况3:如果目标节点有两个子节点
        else:
            # 找到右子树的最小节点
            minNode = findMin(root.right)
            # 将该最小节点的值赋给目标节点
            root.val = minNode.val
            # 删除右子树中的该最小节点
            root.right = deleteNode(root.right, minNode.val)
    
    return root

def findMin(node):
    # 左子树为空,则当前节点为最小
    if node.left is None:
        return node
    # 否则递归搜索左子树
    return findMin(node.left)

总结

本题中,我们学习了如何实现从二叉搜索树中删除节点的操作。需要注意递归过程中保持有序性,以及如何处理三种不同情况。同时,我们也通过本题熟悉了递归操作和树的遍历。