📅  最后修改于: 2023-12-03 15:10:15.011000             🧑  作者: Mango
本题要求使用 Python 语言编写一个程序,对一个二叉查找树(BST)进行操作。BST 是一种满足以下条件的二叉树:
程序要求实现以下操作:
程序运行时,输入为一个序列,其中第一个数字为序列中节点的总数。
代码实现思路如下:
首先定义一个节点类,每个节点有两个孩子节点和一个键值。然后定义一个二叉查找树类,包含插入节点方法、删除节点方法、搜索节点方法、以及遍历输出所有节点键值方法。
插入节点方法实现过程为:从根节点开始,如果要插入的节点键值小于当前节点或者当前节点不存在左孩子,就将节点插入到当前节点的左子树中;否则,就将节点插入到当前节点的右子树中。
删除节点方法实现过程为:首先搜索要删除的节点。如果节点没有子孩子,就直接将其从树中删除。如果节点只有一个孩子,就将其孩子节点上移到父节点位置。如果节点有两个孩子,就将其左子树的最右节点或者右子树的最左节点移动到当前节点位置,然后删除原节点。
搜索节点方法实现过程为:从根节点开始,如果要搜索的节点键值小于当前节点,就继续往左子树搜索;如果要搜索的节点键值大于当前节点,就继续往右子树搜索;如果相等,就找到了要搜索的节点。
遍历输出所有节点键值方法实现过程为:分别输出左子树、当前节点、右子树的键值。
代码实现如下:
class Node:
def __init__(self, key):
self.left = None
self.right = None
self.key = key
class BST:
def __init__(self):
self.root = None
def insert(self, key):
node = Node(key)
if self.root is None:
self.root = node
else:
curr = self.root
while True:
if key < curr.key:
if curr.left is None:
curr.left = node
break
else:
curr = curr.left
else:
if curr.right is None:
curr.right = node
break
else:
curr = curr.right
def delete(self, key):
node = self.root
parent = None
while node is not None and node.key != key:
parent = node
if key < node.key:
node = node.left
else:
node = node.right
if node is None:
return
if node.left is None and node.right is None:
if node == self.root:
self.root = None
elif parent.left == node:
parent.left = None
else:
parent.right = None
elif node.left is None:
if node == self.root:
self.root = node.right
elif parent.left == node:
parent.left = node.right
else:
parent.right = node.right
elif node.right is None:
if node == self.root:
self.root = node.left
elif parent.left == node:
parent.left = node.left
else:
parent.right = node.left
else:
parent = node
left = node.left
while left.right is not None:
parent = left
left = left.right
node.key = left.key
if parent == node:
parent.left = left.left
else:
parent.right = left.left
def search(self, key):
node = self.root
while node is not None and node.key != key:
if key < node.key:
node = node.left
else:
node = node.right
return node
def traverse(self, node):
if node is None:
return
self.traverse(node.left)
print(node.key)
self.traverse(node.right)
def from_list(self, lst):
for key in lst:
self.insert(key)
其中, from_list
方法用于将一个列表转为二叉查找树。运行程序并测试其正确性。