跳到主要内容

简述如何实现二叉搜索树的第 k k 个节点(从小到大) ?

参考答案:

要实现二叉搜索树的第k个节点(从小到大),我们可以使用中序遍历(In-Order Traversal)的方法。在二叉搜索树中,中序遍历的结果是一个升序的节点值序列。因此,我们可以利用中序遍历的特性来找到第k个节点。

下面是一个基于递归的Python实现:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

def kthSmallest(root: TreeNode, k: int) -> TreeNode:
    def inorder_traversal(node, k, count):
        nonlocal result
        if not node:
            return

        # 先遍历左子树
        if node.left:
            inorder_traversal(node.left, k, count)

        # 计数器加1,检查是否找到了第k个节点
        count += 1
        if count == k:
            result = node
            return

        # 如果没有找到,继续遍历右子树
        if node.right:
            inorder_traversal(node.right, k, count)

    # 初始化结果变量
    result = None
    # 从根节点开始中序遍历
    inorder_traversal(root, k, 0)

    return result

在这个实现中,我们首先定义了一个内部函数inorder_traversal,用于执行中序遍历。这个函数接收三个参数:当前节点node、要查找的节点序号k和计数器count。在函数内部,我们首先检查当前节点是否为空,如果为空则直接返回。然后,我们递归地遍历左子树,接着将计数器加1并检查是否达到了第k个节点。如果是,则将当前节点存储在result变量中并返回。最后,如果还没有找到第k个节点,我们递归地遍历右子树。

在主函数kthSmallest中,我们初始化结果变量resultNone,并从根节点开始调用inorder_traversal函数进行中序遍历。最后,我们返回result,即第k个节点。

这个算法的时间复杂度是O(k),因为我们只需要遍历到第k个节点即可。空间复杂度是O(h),其中h是树的高度。在最坏情况下,当树退化为链表时,空间复杂度为O(n),其中n是节点的数量。