📜  门| GATE CS Mock 2018年|问题12(1)

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

GATE CS Mock 2018年 | 问题12

该题考察的是二叉搜索树(BST)和其操作。二叉搜索树具有以下性质:

  • 每个节点的值都比其左子树中任意一个节点的值大
  • 每个节点的值都比其右子树中任意一个节点的值小
  • 左右子树也为二叉搜索树

常见的操作有插入节点、查找节点和删除节点三种。下面对此进行详细介绍。

插入节点

向二叉搜索树中插入一个节点的过程如下:

  1. 如果树为空,则将新节点作为根节点插入
  2. 如果插入节点的值小于根节点,则插入到左子树中,否则插入右子树中
  3. 重复第二步,直至插入完成

以下是插入节点的示例代码:

def insert(root, key):
    if not root:
        return Node(key)
    if key < root.val:
        root.left = insert(root.left, key)
    elif key > root.val:
        root.right = insert(root.right, key)
    return root

其中,root为根节点,key为要插入的值。函数返回插入后的根节点。

查找节点

查找节点的过程与插入类似,不同之处在于:

  • 如果查找节点的值等于当前节点,则返回该节点
  • 如果查找节点的值小于当前节点,则向左子树中查找
  • 如果查找节点的值大于当前节点,则向右子树中查找

以下是查找节点的示例代码:

def search(root, key):
    if not root or root.val == key:
        return root
    if key < root.val:
        return search(root.left, key)
    else:
        return search(root.right, key)

其中,root为根节点,key为要查找的值。如果找到了该节点,则函数返回该节点,否则返回None

删除节点

删除节点需要考虑多种情况,具体过程如下:

  1. 找到要删除的节点,若不存在则返回
  2. 如果要删除的节点没有子节点,直接删除
  3. 如果要删除的节点只有一个子节点,则将子节点替换为要删除的节点
  4. 如果要删除的节点有两个子节点,则将其右子树中的最小值替换为要删除的节点
  5. 删除右子树中的最小节点

以下是删除节点的示例代码:

def delete(root, key):
    if not root:
        return root
    elif key < root.val:
        root.left = delete(root.left, key)
    elif key > root.val:
        root.right = delete(root.right, key)
    else:
        if not root.left:
            return root.right
        elif not root.right:
            return root.left
        temp = findMin(root.right)
        root.val = temp.val
        root.right = delete(root.right, temp.val)
    return root

def findMin(root):
    while root.left:
        root = root.left
    return root

其中,root为根节点,key为要删除的值。函数返回删除节点后的根节点。

以上就是二叉搜索树的操作介绍,包括插入节点、查找节点和删除节点三种。