【LeetCode-中等题】230. 二叉搜索树中第K小的元素

这篇具有很好参考价值的文章主要介绍了【LeetCode-中等题】230. 二叉搜索树中第K小的元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

【LeetCode-中等题】230. 二叉搜索树中第K小的元素,力扣,# 中等题,leetcode,链表,算法

【LeetCode-中等题】230. 二叉搜索树中第K小的元素,力扣,# 中等题,leetcode,链表,算法

该题最大的特点就是这个树是二叉树:
【LeetCode-中等题】230. 二叉搜索树中第K小的元素,力扣,# 中等题,leetcode,链表,算法

所以,中序遍历对二叉树的遍历本身就是有序的

方法一:层序遍历 + 集合排序

思想很简单,就是通过层序遍历将节点都加到List集合中,然后调用 Collections.sort(list)排序后,找第k小的数list.get(k-1)

    public int kthSmallest(TreeNode root, int k) {
            List<Integer> list = levelOrder(root);
            Collections.sort(list);
            return list.get(k-1);
            
        }
        public List<Integer> levelOrder(TreeNode root) {
                List<Integer> result = new ArrayList<>();
                Queue<TreeNode> queue = new LinkedList<TreeNode>();
                if(root == null) return result;
                queue.offer(root);
                while(!queue.isEmpty()){
                    int count = queue.size();
                    for(int i =0 ;i< count ;i++){
                      TreeNode node =   queue.poll();
                        result.add(node.val); 
                        if(node.left != null)  queue.offer(node.left);
                         if(node.right != null) queue.offer(node.right);
                    }
                }
                return result;
    }

方法二:中序遍历(栈 或者 递归 )

二叉树中序遍历得到的值序列是递增有序的 借助一个list集合来接收有序的节点 然后再按照k去list集合区第k小的数

  List<Integer> list =new ArrayList<>();
    public int kthSmallest(TreeNode root, int k) {
      
        // dfs(root);    //递归中序
        stackTree(root); //  栈中序
        return list.get(k-1);
        
    }
    //递归中序
    //  public void dfs(TreeNode root) {
    //      if(root == null ) return ;

    //      dfs(root.left);
    //      list.add(root.val);
    //      dfs(root.right);
    //  }

    //  栈中序
     public void stackTree(TreeNode root) {
           Deque<TreeNode> stack = new ArrayDeque<TreeNode>();
           while(!stack.isEmpty() || root != null){
                while(root != null){
                    stack.push(root);
                    root = root.left;
                }
                root = stack.pop();
                list.add(root.val);
                root = root.right;
           }
     }

方法三(方法二改进):中序遍历(栈 )

二叉树中序遍历得到的值序列是递增有序的 那只要栈每次弹出一个元素时 就让k-1(直到k=0) 例如要第1小的数 那么其实就是中序遍历栈弹出的第一个元素(k= k-1 ===0,立马返回第一次pop的数)文章来源地址https://www.toymoban.com/news/detail-683307.html

    public int kthSmallest(TreeNode root, int k) {
        Deque<TreeNode> stack = new ArrayDeque<TreeNode>();
        while(!stack.isEmpty() || root != null){
            while(root != null){
                stack.push(root);
                root = root.left;
            }
            
            root = stack.pop();
            k--;//每弹出一个元素,就让k--
            if(k == 0) return root.val;//直到k减到0  说明该root.val就是第k小的数
            root = root.right;
        }
        return -1;
     }

到了这里,关于【LeetCode-中等题】230. 二叉搜索树中第K小的元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java数据结构与算法刷题-----LeetCode378. 有序矩阵中第 K 小的元素

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 解题思路 已知矩阵相对有序,可以用二分搜索,不过和一维数组排序不同,这是二维的 每一行都递增,每一列也是递增,所以每

    2024年01月23日
    浏览(51)
  • 有序矩阵中第 K 小的元素

    有序矩阵中第 K 小的元素 每行和每列元素均按升序排序 找到一个内存复杂度优于 O(n²) 的解决方案 使用二分查找,思路为: (1)因为左上角的元素值更小,右下角的元素值更大,先将left设置为左上角元素的值,right设置为右下角元素的值; (2)判断不大于left和right中间值

    2024年01月20日
    浏览(74)
  • LeetCode 501. 二叉搜索树中的众数【二叉搜索树中序遍历+Morris遍历】简单

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月06日
    浏览(44)
  • 【优先队列】378. 有序矩阵中第 K 小的元素

    初始化最大堆: 创建一个最大堆的优先队列,这使得队列中的元素按照降序排列。 遍历矩阵并更新队列: 通过嵌套的循环遍历二维矩阵中的每一个元素,将元素添加到最大堆中。 控制队列大小: 在添加元素后,检查队列的大小是否已经达到了k。如果已经达到,而且当前遍

    2024年01月22日
    浏览(50)
  • LeetCode(力扣)700. 二叉搜索树中的搜索Python

    https://leetcode.cn/problems/search-in-a-binary-search-tree/ 递归法 迭代

    2024年02月11日
    浏览(33)
  • leetcode: 1261: 在受污染的二叉树中查找元素

    给出一个满足下述规则的二叉树: root.val == 0 如果  treeNode.val == x  且  treeNode.left != null ,那么  treeNode.left.val == 2 * x + 1 如果  treeNode.val == x  且  treeNode.right != null ,那么  treeNode.right.val == 2 * x + 2 现在这个二叉树受到「污染」,所有的  treeNode.val  都变成了  -1 。 请你先

    2024年03月12日
    浏览(34)
  • 【LeetCode75】第四十一题 二叉搜索树中的搜索

    目录 题目: 示例: 分析: 代码: 题目给我们一个搜索二叉树,让我们找出节点值等于目标的节点并返回出去。 首先我们可以直接遍历整棵二叉树,找到值相同的节点就返回出去,不过这样就没有用到二叉搜索数的特性了。 二叉搜索数的特性就是,每一个节点的左子树上所

    2024年02月10日
    浏览(48)
  • 【算法与数据结构】700、LeetCode二叉搜索树中的搜索

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :二叉搜索树(Binary Search Tree, BST)的性质:所有左子树节点键值 中间节点键值 所有右子树节点键值,并且左右子树都是二叉搜索树。那么我们根据此性质,对比目标值和中间节点,如

    2024年02月10日
    浏览(41)
  • 【算法刷题day22】Leetcode:235. 二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 50.删除二叉搜索树中的节点

    文档链接:[代码随想录] 题目链接:235. 二叉搜索树的最近公共祖先 题目: 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深

    2024年04月13日
    浏览(40)
  • LeetCode_二叉搜索树_中等_236.二叉搜索树的最近公共祖先

    给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜

    2023年04月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包