📜  门| GATE-CS-2001 |问题18(1)

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

问题简介

本文介绍了 GATE-CS-2001 题目集中的问题18。此问题需要你实现一个函数,可以从二叉搜索树中删除一个节点。

问题详解

为了解决这个问题,我们需要考虑以下几个方面:

  1. 当删除叶节点时:只需将其父节点对应的左/右指针指向空即可。

  2. 当删除仅有一个子节点的节点时:只需将其父节点对应的左/右指针指向其子节点即可。

  3. 当删除拥有两个子节点的节点时:需要找到该节点的中序后继节点(即比该节点大的最小节点),用后继节点替换该节点。

实现代码如下:

# 定义节点结构体
class TreeNode():
    def __init__(self, val = None, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

# 在二叉搜索树中删除一个节点
def delete_node(root, key):
    # 如果根节点为空,直接返回None
    if not root:
        return None
    # 如果当前节点大于目标值,递归处理左子树
    if key < root.val:
        root.left = delete_node(root.left, key)
    # 如果当前节点小于目标值,递归处理右子树
    elif key > root.val:
        root.right = delete_node(root.right, key)
    # 如果当前节点等于目标值,删除当前节点
    else:
        # 当前节点没有左子树,直接返回右子树
        if not root.left:
            return root.right
        # 当前节点没有右子树,直接返回左子树
        elif not root.right:
            return root.left
        # 当前节点有左右子树
        else:
            # 找到当前节点的中序后继节点
            # 中序后继节点为右子树中最小的节点
            successor = root.right
            while successor.left:
                successor = successor.left
            # 将后继节点的值复制到当前节点
            root.val = successor.val
            # 删除后继节点
            root.right = delete_node(root.right, successor.val)
    return root

总结

本文介绍了 GATE-CS-2001 题目集中的问题18。该问题要求我们实现一个函数,可以从二叉搜索树中删除一个节点。我们介绍了删除叶节点、删除仅有一个子节点的节点、删除拥有两个子节点的节点三种情况,并提供了相应的代码实现。