力扣: 二叉搜索树中第K小的元素

简介: 力扣: 二叉搜索树中第K小的元素

预备知识


二叉搜索树


  • 它或者是一棵空树,或者是具有下列性质的二叉树:
  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉排序树。


中序遍历


中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。


二叉搜索树的中序遍历


二叉搜索树中,左子树的值 < 根节点 < 右子树,中序遍历顺序是 左 -> 根 -> 右,因此二叉搜索树的中序遍历结果为一串值从小到大递增序列。


题目: 二叉搜索树中第K小的元素


题目来源: 二叉搜索树中第K小的元素


题目描述: 给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。


示例:


输入: root = [3,1,4,null,2], k = 1
输出: 1
复制代码

image.png

题目分析


有了预备知识的基础,我们可以很轻易地得出当前题目的思路,使用中序遍历二叉搜索树,当遍历到第 k 个节点后,退出遍历,返回结果。


代码


本文章采取非递归模式的中序遍历.


def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
  cnt = 0
  p = root
  stack = []
  # 
  while p != None or len(stack) :
      # 遍历左子树
      while p != None:
          stack.append(p)
          p = p.left
      # 如果栈中不空,说明还存在节点待遍历
      if len(stack):
          tmp = stack.pop()
          # 中序遍历的右节点
          p = tmp.right
          cnt += 1
          # 遍历到第k个节点,返回结果
          if cnt == k:
              return tmp.val
复制代码


往期精彩文章



后语


如果大家感觉此文对你有一些帮助,希望能点个赞,鼓励鼓励阿包,阿包会不断努力的。另外如果本文章有问题,或者对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!


目录
打赏
0
0
0
0
5
分享
相关文章
|
9月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
99 1
【LeetCode 热题100】347:前 K 个高频元素(详细解析)(Go语言版)
这篇文章详细解析了力扣热题 347——前 K 个高频元素的三种解法:哈希表+小顶堆、哈希表+快速排序和哈希表+桶排序。每种方法都附有清晰的思路讲解和 Go 语言代码实现。小顶堆方法时间复杂度为 O(n log k),适合处理大规模数据;快速排序方法时间复杂度为 O(n log n),适用于数据量较小的场景;桶排序方法在特定条件下能达到线性时间复杂度 O(n)。文章通过对比分析,帮助读者根据实际需求选择最优解法,并提供了完整的代码示例,是一篇非常实用的算法学习资料。
251 90
|
9月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
88 0
|
9月前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
47 1
|
9月前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
63 1
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
11月前
|
【Leetcode刷题Python】96. 不同的二叉搜索树
LeetCode 96题 "不同的二叉搜索树" 的Python解决方案,使用动态规划算法计算由1至n互不相同节点值组成的二叉搜索树的种数。
68 3
【Leetcode刷题Python】96. 不同的二叉搜索树
|
9月前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
88 0
|
9月前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
42 0
|
9月前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
70 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问