📅  最后修改于: 2023-12-03 15:12:44.232000             🧑  作者: Mango
本题是关于数据结构的问题,需要实现一个二叉查找树(BST)的两个方法。
请实现一个 BinarySearchTree (二叉查找树)类,具有以下两个方法:
search(val)
:查找树中是否存在值为 val
的节点。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
类中实现以下两个方法:
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
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$ 表示节点数。
在二叉查找树的实现中,我们需要实现节点类以及 search
和 insert
两个方法。二叉查找树的查找和插入方法的时间复杂度都是 $O(\log n)$,因此二叉查找树可以非常高效地解决许多数据结构问题。