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

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

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

二叉搜索树是一种常用的数据结构,具有快速插入、删除、查找等特点。在使用中,常常需要对二叉搜索树进行一些常见的操作,如插入节点、删除节点、查找最大值、查找最小值等。本文将介绍问题 4,即查找二叉搜索树中第 k 小的元素。

问题描述

给定一棵二叉搜索树和一个整数 k,编写一个函数,查找二叉搜索树中第 k 小的元素。假设 k 的范围是 [1, 树中节点个数],并且每个节点的值都是唯一的。

解法思路

由于二叉搜索树具有左子树小于根节点,右子树大于根节点的性质,因此我们可以通过中序遍历二叉搜索树,得到一个递增有序的序列。因此,问题 4 可以转换为在二叉搜索树的中序遍历中查找第 k 小的元素。

具体实现时,我们使用递归的方法对每个节点进行中序遍历,并记录当前遍历到的节点的序号 count。若 count 等于 k,则返回当前节点的值。否则,在递归中左子树中继续查找第 k 小的元素,若还没有找到,则在右子树中继续查找第 k - count - 1 小的元素。

具体代码如下:

class Solution:
    def kthSmallest(self, root: TreeNode, k: int) -> int:
        self.count = 0
        self.k = k
        return self.inorderTraversal(root)

    def inorderTraversal(self, root: TreeNode) -> int:
        if not root:
            return -1
        val = self.inorderTraversal(root.left)
        if self.count == self.k:
            return val
        self.count += 1
        if self.count == self.k:
            return root.val
        return self.inorderTraversal(root.right)
总结

本文介绍了二叉搜索树问题 4,即查找二叉搜索树中第 k 小的元素。我们通过中序遍历二叉搜索树得到一个递增有序序列,并在中序遍历递归的过程中查找第 k 小的元素。这个问题的时间复杂度为 O(h + k),其中 h 是树的高度,因为我们只需要遍历到第 k 小的元素的位置即可。