← 返回博客列表
Uber

Uber 树算法面试:BST 中第 K 大元素的多种解法

2025-11-03

Uber 面试中的经典树算法题。本文通过 BST K 大元素问题,展示中序遍历的灵活应用和优化技巧,csvosupport 助你掌握树算法精髓

📋 问题定义

给定一棵二叉搜索树(BST)和整数 k,找到树中第 k 大的元素

*约束

🎯 解法演进

方法一:中序遍+ 数组

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,获得真题