📜  门| GATE-CS-2017(套装1)|问题 19(1)

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

问题19

本题是关于数据结构的问题,需要实现一个二叉查找树(BST)的两个方法。

问题描述

请实现一个 BinarySearchTree (二叉查找树)类,具有以下两个方法:

  1. search(val) :查找树中是否存在值为 val 的节点。
  2. insert(val) :向树中插入值为 val 的节点。

如下所示为 BST 的示例图:

    4
   / \
  2   7
 / \
1   3
解题方法

我们可以用一个类来表示二叉查找树中的一个节点,该节点需要包含该节点的值、左右子节点以及用于比较节点值的方法。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
    
    def __lt__(self, other):
        return self.val < other
    
    def __eq__(self, other):
        return self.val == other
    
    def __gt__(self, other):
        return self.val > other

接下来,我们可以使用 TreeNode 类来实现 BinarySearchTree 类。

BinarySearchTree 类中,我们需要维护一个指向根节点的 root 属性。

class BinarySearchTree:
    def __init__(self):
        self.root = None

然后,我们可以在 BinarySearchTree 类中实现以下两个方法:

  1. search(val) :查找树中是否存在值为 val 的节点。

    在 BST 中查找节点的方法为,从根节点开始,如果查找的值大于当前节点值,则在右子树中继续查找,如果查找的值小于当前节点值,则在左子树中继续查找。 如果查找到的节点值与目标值相等,则返回 True,否则返回 False。

    def search(self, val):
        node = self.root
        while node:
            if node == val:
                return True
            elif node > val:
                node = node.left
            else:
                node = node.right
        return False
    
  2. insert(val) :向树中插入值为 val 的节点。

    在 BST 中,向树中插入节点的方法为,从根节点开始,如果插入的值大于当前节点值,则在右子树中继续查找,如果插入的值小于当前节点值,则在左子树中继续查找,直到找到可以插入节点的位置。然后,将新节点插入到该位置。

    def insert(self, val):
        node = self.root
        if not node:
            self.root = TreeNode(val)
            return
        while node:
            if node > val:
                if not node.left:
                    node.left = TreeNode(val)
                    return
                node = node.left
            else:
                if not node.right:
                    node.right = TreeNode(val)
                    return
                node = node.right
    
复杂度分析

在 BST 中,查找和插入一个节点的时间复杂度均为 $O(\log n)$,其中 $n$ 表示节点数。

总结

在二叉查找树的实现中,我们需要实现节点类以及 searchinsert 两个方法。二叉查找树的查找和插入方法的时间复杂度都是 $O(\log n)$,因此二叉查找树可以非常高效地解决许多数据结构问题。