📜  GATE CS 2016 Sec 4 – BST(1)

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

GATE CS 2016 Sec 4 – BST

该题目主要涉及二叉搜索树(Binary Search Tree,BST)的概念和操作。

什么是BST?

二叉搜索树(BST)是一种特殊的二叉树,具有以下性质:

  • 每个节点都有一个键值;
  • 所有左子树的节点都小于其父节点的键值;
  • 所有右子树的节点都大于其父节点的键值;
  • 没有重复的节点。

如下图所示,就是一个合法的BST:

      4
     / \
    2   5
   / \
  1   3
常见操作

二叉搜索树(BST)支持如下常见操作:

插入元素

将一个元素插入BST的操作,通常的实现方法是递归地比较节点的键值,然后将元素插入到适当的位置,保证BST的特性得以维护。

示例代码:

def insert(root, key):
    if root is None:
        return Node(key)
    elif root.key < key:
        root.right = insert(root.right, key)
    else:
        root.left = insert(root.left, key)
    return root
删除元素

删除一个元素的操作,有以下几种情况:

  • 节点没有子节点,直接删除;
  • 节点只有一个子节点,删除该节点,将子节点升级为当前节点;
  • 节点有两个子节点,将该节点的后继节点的值复制到该节点,然后删除后继节点。

示例代码:

def minValueNode(root):
    curr = root
    while(curr.left is not None):
        curr = curr.left
    return curr
 
def deleteNode(root, key):
    if root is None:
        return root
    if key < root.key:
        root.left = deleteNode(root.left, key)
    elif key > root.key:
        root.right = deleteNode(root.right, key)
    else:
        if root.left is None:
            temp = root.right
            root = None
            return temp
        elif root.right is None:
            temp = root.left
            root = None
            return temp
        temp = minValueNode(root.right)
        root.key = temp.key
        root.right = deleteNode(root.right, temp.key)
    return root
查找元素

在BST中查找一个元素的操作,也是通过递归比较节点的键值实现的。

示例代码:

def search(root, key):
    if root is None or root.key == key:
        return root
    if root.key < key:
        return search(root.right, key)
    return search(root.left, key)
算法复杂度

对于一个平衡的BST,其插入、删除操作的平均时间复杂度为 O(log n),查找元素操作的时间复杂度也为 O(log n)。但如果 BST 没有平衡,就会出现最坏情况,时间复杂度为 O(n)。

总结

本题介绍了二叉搜索树(BST)的概念和操作,包括插入、删除、查找元素等操作。同时介绍了BST的时间复杂度和最优情况,为程序员在工作中使用BST提供了理论基础。