📅  最后修改于: 2023-12-03 15:25:15.443000             🧑  作者: Mango
BST(Binary Search Tree),二叉搜索树,是一种特殊的二叉树。它有以下特点:
BST非常适合用于对数据进行排序和查找操作。
BST是一种有序的树结构,将BST展平为排序列表也就是将BST的所有节点按从小到大的顺序输出。
有以下两种方法可以将BST展平为排序列表:
中序遍历BST的输出就是按从小到大排序的结果,因此我们只需要按照中序遍历的方式遍历BST,并将节点值存储在一个列表里即可。
def inorder_traversal(root):
res = []
def dfs(node):
if not node:
return
dfs(node.left)
res.append(node.val)
dfs(node.right)
dfs(root)
return res
def flatten_bst(root):
vals = inorder_traversal(root)
if not vals:
return None
return ListNode(vals.pop(0), next=flatten_bst_helper(vals))
def flatten_bst_helper(vals):
if not vals:
return None
return ListNode(vals.pop(0), next=flatten_bst_helper(vals))
上面的代码中,inorder_traversal
函数用于对BST进行中序遍历;flatten_bst
函数用于将BST展平为排序列表;flatten_bst_helper
函数则是一个辅助函数,用于递归创建排序列表。
BST的节点本身已经是排序好的,因此我们也可以利用BST节点之间的关系进行展平操作。
具体做法是,从根节点出发,每次找到当前节点的最左子节点,将其与当前节点的右子节点进行交换,并将交换后的右子节点作为新的当前节点,重复该过程,直到所有节点都被遍历完毕。
def flatten_bst(root):
def flatten_helper(node):
if not node:
return None, None
left_most = flatten_helper(node.left)
right_most = flatten_helper(node.right)
node.left = None
if left_most:
node.right = left_most[0]
left_most[1].right = right_most[0]
else:
node.right = right_most[0]
return node, right_most[1] or node
return flatten_helper(root)[0]
上面的代码中,flatten_helper
函数用于递归地将BST进行展平操作,将根节点和最右子节点作为返回值返回。
在订单系统中,我们经常需要对订单进行增加、删除、查询操作。对于订单的增加操作,我们可以借鉴上面的BST展平为排序列表的思想,利用BST的特性进行优化。
具体做法是,将订单号作为BST节点的值,利用BST对订单号进行排序。每次增加订单时,在BST中查找到合适的位置插入新的订单号即可。
class OrderSystem:
def __init__(self):
self.root = None
def add_order(self, order_id):
self.root = self._add_order(self.root, order_id)
def _add_order(self, node, order_id):
if not node:
node = TreeNode(order_id)
return node
if order_id < node.val:
node.left = self._add_order(node.left, order_id)
else:
node.right = self._add_order(node.right, order_id)
return node
上面的代码中,OrderSystem
类代表订单系统,利用BST对订单进行排序和存储。_add_order
函数用于递归地将订单号插入BST中。每次添加订单时,只需要调用add_order
函数即可。