📅  最后修改于: 2023-12-03 14:54:56.068000             🧑  作者: Mango
二叉搜索树是一种常见的树形数据结构,它是在树的基础上增加了一些特殊的性质。具体而言,二叉搜索树的每个节点都包含一个键值,键值的大小关系满足左小右大的原则。
问题2是对二叉搜索树的操作之一,需要在二叉搜索树中查找一个节点,如果该节点存在,则删除它并返回删除后的树,如果该节点不存在,则不做任何操作。
首先,我们需要定义二叉搜索树的节点类,它包含三个属性:键值key
、左子节点left
和右子节点right
。
class Node:
def __init__(self, key):
self.key = key
self.left = None
self.right = None
接下来,我们定义二叉搜索树的类。它包含一个属性root
,表示树的根节点。我们需要在这个类中实现两个方法insert
和delete
,分别用于在树中插入一个节点和删除一个节点。
class BinarySearchTree:
def __init__(self):
self.root = None
def insert(self, key):
if not self.root:
self.root = Node(key)
else:
self._insert(key, self.root)
def _insert(self, key, node):
if key < node.key:
if node.left:
self._insert(key, node.left)
else:
node.left = Node(key)
else:
if node.right:
self._insert(key, node.right)
else:
node.right = Node(key)
def delete(self, key):
if not self.root:
return None
else:
self.root = self._delete(key, self.root)
return self.root
def _delete(self, key, node):
if not node:
return None
else:
if key == node.key:
if not node.left and not node.right:
node = None
elif not node.left:
node = node.right
elif not node.right:
node = node.left
else:
min_node = self._find_min(node.right)
node.key = min_node.key
node.right = self._delete(min_node.key, node.right)
elif key < node.key:
node.left = self._delete(key, node.left)
else:
node.right = self._delete(key, node.right)
return node
def _find_min(self, node):
if node.left:
return self._find_min(node.left)
else:
return node
其中,_insert
方法是一个递归方法,用于在二叉搜索树中插入一个新的节点。_delete
方法同样是一个递归方法,用于删除二叉搜索树中的一个节点。如果节点有两个子节点,则需要找到右子树中的最小节点来替代当前节点。
下面是一个测试程序,用于验证上述代码的正确性。
bst = BinarySearchTree()
bst.insert(5)
bst.insert(3)
bst.insert(7)
bst.insert(1)
bst.insert(9)
bst.insert(4)
bst.insert(2)
bst.insert(6)
bst.insert(8)
bst.delete(5)
print(bst.root.key) # 输出6
我们先创建一个二叉搜索树,并插入一些节点。然后,我们删除根节点,并打印出删除后的根节点的值。由于删除节点5时,找到右子树中的最小节点6替代了5,所以打印出的结果为6,证明了我们的代码的正确性。
二叉搜索树是一种常用的数据结构,它可以支持快速查找、插入、删除等操作。本文介绍了如何实现二叉搜索树的节点类和树类,并用具体的例子演示了如何在二叉搜索树中删除一个节点。