力扣: 二叉搜索树中第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
复制代码


往期精彩文章



后语


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


相关文章
|
22天前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
31 1
|
28天前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
30 0
|
28天前
【LeetCode 45】701.二叉搜索树中的插入操作
【LeetCode 45】701.二叉搜索树中的插入操作
9 1
|
28天前
【LeetCode 44】235.二叉搜索树的最近公共祖先
【LeetCode 44】235.二叉搜索树的最近公共祖先
15 1
|
28天前
【LeetCode 48】108.将有序数组转换为二叉搜索树
【LeetCode 48】108.将有序数组转换为二叉搜索树
34 0
|
28天前
【LeetCode 47】669.修剪二叉搜索树
【LeetCode 47】669.修剪二叉搜索树
8 0
|
28天前
【LeetCode 46】450.删除二叉搜索树的节点
【LeetCode 46】450.删除二叉搜索树的节点
11 0
|
28天前
【LeetCode 42】501.二叉搜索树中的众数
【LeetCode 42】501.二叉搜索树中的众数
8 0
|
28天前
【LeetCode 41】530.二叉搜索树的最小绝对差
【LeetCode 41】530.二叉搜索树的最小绝对差
9 0
|
28天前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
10 0