在Python中实现二叉搜索树的插入、查找及删除操作
发布时间:2023-06-12 13:51:01
二叉搜索树是一种常用的数据结构,它以一种有序的方式存储数据,可以快速地进行插入、查找和删除操作。在Python中,我们可以使用类的形式来实现二叉搜索树。
首先,我们定义一个类TreeNode,它包含了二叉搜索树的基本节点结构:左右子树和节点值。代码如下:
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
接着,我们定义一个二叉搜索树类BST,它包含了二叉搜索树的插入、查找和删除操作。代码如下:
class BST:
def __init__(self):
self.root = None
def insert(self, val):
if not self.root:
self.root = TreeNode(val)
else:
self._insert(val, self.root)
def _insert(self, val, node):
if val < node.val:
if node.left is None:
node.left = TreeNode(val)
else:
self._insert(val, node.left)
else:
if node.right is None:
node.right = TreeNode(val)
else:
self._insert(val, node.right)
def search(self, val):
return self._search(val, self.root)
def _search(self, val, node):
if not node:
return False
elif node.val == val:
return True
elif val < node.val:
return self._search(val, node.left)
else:
return self._search(val, node.right)
def delete(self, val):
self.root = self._delete(val, self.root)
def _delete(self, val, node):
if not node:
return node
elif val < node.val:
node.left = self._delete(val, node.left)
elif val > node.val:
node.right = self._delete(val, node.right)
else:
# Case 1: No child
if not node.left and not node.right:
node = None
# Case 2: One child
elif not node.left:
node = node.right
elif not node.right:
node = node.left
# Case 3: Two children
else:
temp = self._find_min(node.right)
node.val = temp.val
node.right = self._delete(temp.val, node.right)
return node
def _find_min(self, node):
while node.left:
node = node.left
return node
在BST类中,我们使用了私有方法(以“_”开头)来进行递归操作,其中:
- insert()方法用于插入新节点,如果二叉搜索树还没有根节点,则直接将其插入为根节点。否则,我们将其插入到左子树或右子树中,直到找到合适的节点。
- search()方法用于查找节点,如果找到,则返回True,否则返回False。
- delete()方法用于删除节点,我们使用三种情况对底层的节点进行删除操作:1.节点为叶子节点;2.节点只有一个子节点;3.节点有两个子节点。我们使用_find_min()方法来找到要删除节点右子树的最小节点,并将其值复制给要删除的节点。
下面我们来测试一下这个二叉搜索树的实现:
bst = BST() bst.insert(5) bst.insert(3) bst.insert(7) bst.insert(2) bst.insert(4) bst.insert(6) bst.insert(8) print(bst.search(5)) print(bst.search(2)) print(bst.search(9)) bst.delete(5) print(bst.search(5))
在上述测试中,我们先插入了一些节点,然后查找了一些值,最后删除了一个节点,并再次查找已删除的节点。输出结果如下:
True True False False
可以看到,我们的实现已经正确地进行插入、查找和删除操作了。
