defsearch_bst_iterative(root, target):
cur = root
while cur isnotNoneand cur.val != target:
if target < cur.val:
cur = cur.left
else:
cur = cur.right
return cur
递归 vs 迭代:递归实现简洁直观,但在树深度较大时可能栈溢出;迭代实现使用循环而非函数调用栈,空间复杂度为O(1),是更优的工程实践。两种实现的时间复杂度相同,均为O(h),其中h为树的高度。
# BST的中序遍历(递归)—— 输出递增序列definorder_traversal(root):
result = []
def_inorder(node):
if node isNone:
return
_inorder(node.left)
result.append(node.val)
_inorder(node.right)
_inorder(root)
return result
# BST的中序遍历(迭代)—— 使用栈模拟递归definorder_iterative(root):
result, stack = [], []
cur = root
while cur or stack:
# 一路向左,将路径上的节点压栈while cur:
stack.append(cur)
cur = cur.left
# 弹出栈顶,访问节点,转向右子树
cur = stack.pop()
result.append(cur.val)
cur = cur.right
return result
defget_successor(root, p):
"""
查找节点p的中序后继
情况1: p有右子树 → 右子树中的最小值
情况2: p无右子树 → 从根到p的路径上,最后一个"向左转"的祖先节点
"""if p.right:
# 情况1:右子树的最小值
cur = p.right
while cur.left:
cur = cur.left
return cur
# 情况2:从根开始查找
successor = None
cur = root
while cur and cur != p:
if p.val < cur.val:
# 当前节点值大于p,是候选后继
successor = cur
cur = cur.left
else:
cur = cur.right
return successor
defget_predecessor(root, p):
"""
查找节点p的中序前驱
情况1: p有左子树 → 左子树中的最大值
情况2: p无左子树 → 从根到p的路径上,最后一个"向右转"的祖先节点
"""if p.left:
cur = p.left
while cur.right:
cur = cur.right
return cur
predecessor = None
cur = root
while cur and cur != p:
if p.val > cur.val:
predecessor = cur
cur = cur.right
else:
cur = cur.left
return predecessor
classBST:
class_Node:
def__init__(self, val):
self.val = val
self.left = Noneself.right = Nonedef__init__(self):
self._root = Noneself._size = 0defsearch(self, target):
"""查找目标值,返回节点或None"""
cur = self._root
while cur and cur.val != target:
if target < cur.val:
cur = cur.left
else:
cur = cur.right
return cur
definsert(self, val):
"""插入值(迭代版)"""ifself._root isNone:
self._root = self._Node(val)
self._size += 1return
cur = self._root
whileTrue:
if val < cur.val:
if cur.left isNone:
cur.left = self._Node(val)
self._size += 1break
cur = cur.left
elif val > cur.val:
if cur.right isNone:
cur.right = self._Node(val)
self._size += 1break
cur = cur.right
else:
break# 值已存在,不插入defdelete(self, key):
"""删除值"""self._root = self._delete(self._root, key)
def_delete(self, node, key):
if node isNone:
returnNoneif key < node.val:
node.left = self._delete(node.left, key)
elif key > node.val:
node.right = self._delete(node.right, key)
else:
if node.left isNone:
self._size -= 1return node.right
if node.right isNone:
self._size -= 1return node.left
# 有两个子节点:用后继替换
succ = self._find_min(node.right)
node.val = succ.val
node.right = self._delete(node.right, succ.val)
return node
def_find_min(self, node):
while node.left:
node = node.left
return node
definorder(self):
"""中序遍历,返回有序列表"""
result, stack = [], []
cur = self._root
while cur or stack:
while cur:
stack.append(cur)
cur = cur.left
cur = stack.pop()
result.append(cur.val)
cur = cur.right
return result
defsuccessor(self, val):
"""查找给定值的后继,返回节点值或None"""
node = self._search_node(val)
if node isNone:
returnNoneif node.right:
cur = node.right
while cur.left:
cur = cur.left
return cur.val
cur = self._root
succ = Nonewhile cur and cur != node:
if val < cur.val:
succ = cur
cur = cur.left
else:
cur = cur.right
return succ.val if succ elseNonedef_search_node(self, val):
cur = self._root
while cur and cur.val != val:
if val < cur.val:
cur = cur.left
else:
cur = cur.right
return cur
def__len__(self):
returnself._size
def__contains__(self, val):
returnself._search_node(val) isnotNone