📜  数据结构|二叉搜索树|问题8(1)

📅  最后修改于: 2023-12-03 15:26:09.364000             🧑  作者: Mango

数据结构 | 二叉搜索树 | 问题8

简介

本文介绍二叉搜索树的问题8:寻找二叉搜索树中第k小的节点。

问题描述

给定一个二叉搜索树(BST)的根节点root和一个整数k,找到树中第k小的节点。

解决方案
方法一:中序遍历

一棵二叉搜索树进行中序遍历,得到的就是有序的结果。因此,我们可以先对二叉搜索树进行中序遍历,得到有序数组,然后返回第k个元素。

算法实现

class Solution:
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        def inorderTraversal(root: TreeNode) -> List[int]:
            res = []
            if not root:
                return res
            res += inorderTraversal(root.left)
            res.append(root.val)
            res += inorderTraversal(root.right)
            return res
        res = inorderTraversal(root)
        return res[k-1]

算法分析

  • 时间复杂度:O(n),其中n为二叉搜索树的节点数,因为每个节点都会被访问一次。
  • 空间复杂度:O(n),因为需要存储所有的节点值。
方法二:迭代

二叉搜索树的中序遍历可以用迭代方式实现。具体思路是用栈以及一个计数器来模拟中序遍历的过程,当计数器达到k时即可返回当前节点的值。

算法实现

class Solution:
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        stack = []
        cur = root
        count = 0
        while stack or cur:
            while cur:
                stack.append(cur)
                cur = cur.left
            cur = stack.pop()
            count += 1
            if count == k:
                return cur.val
            cur = cur.right

算法分析

  • 时间复杂度:O(n),其中n为二叉搜索树的节点数,因为每个节点都会被访问一次。
  • 空间复杂度:O(h),其中h为二叉搜索树的高度,因为在最坏的情况下,栈的存储需要到达二叉搜索树的最大深度。
总结

本文介绍了如何在二叉搜索树中寻找第k小的节点。常规方法是进行中序遍历,得到有序数组,返回第k个元素。另一种方法是迭代,模拟中序遍历的过程,当计数器达到k时返回当前节点的值。两种方法时间复杂度相同,但空间复杂度不同,并且迭代方法在最坏情况下空间复杂度较低。