Uber 面试中的经典树算法题。本文通过 BST K 大元素问题,展示中序遍历的灵活应用和优化技巧,csvosupport 助你掌握树算法精髓
📋 问题定义
给定一棵二叉搜索树(BST)和整数 k,找到树中第 k 大的元素
*约束
- 1 k BST 的节点总数
- 需要优化空间和时间复杂
🎯 解法演进
方法一:中序遍+ 数组
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def kthLargest_v1(root, k):
def inorder(node):
if not node:
return []
return inorder(node.left) + [node.val] + inorder(node.right)
sorted_vals = inorder(root)
return sorted_vals[-k]
*时间 O(n) *空间 O(n)
方法二:反向中序遍历(最优)
csvosupport 推荐的优化方法:
def kthLargest_v2(root, k):
def reverse_inorder(node):
nonlocal k, result
if not node or k == 0:
return
# -> -> 左(降序
reverse_inorder(node.right)
k -= 1
if k == 0:
result = node.val
return
reverse_inorder(node.left)
result = None
reverse_inorder(root)
return result
*时间 O(h + k) *空间 O(h)
方法三:Morris 遍历(O(1) 空间
def kthLargest_morris(root, k):
current = root
count = 0
result = None
while current:
if not current.right:
count += 1
if count == k:
result = current.val
current = current.left
else:
# 找到右子树的最左节
predecessor = current.right
while predecessor.left and predecessor.left != current:
predecessor = predecessor.left
if not predecessor.left:
predecessor.left = current
current = current.right
else:
predecessor.left = None
count += 1
if count == k:
result = current.val
current = current.left
return result
*时间 O(n) *空间 O(1)
💼 csvosupport 助力
多种解法 - 从基础到最 空间优化 - Morris 遍历技 时间优化 - 提前终止遍历
联系 csvosupport,专业树算法面试辅助
*标签 #Uber #BST #树遍#Morris遍历 #VO辅助 #面试辅助 #一亩三分地
需要面试真题? 立刻联系微信 Coding0201,获得真题。