zoukankan      html  css  js  c++  java
  • 求得二叉搜索树的第k小的元素

    求得二叉搜索树的第k小的元素

    给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素。

    须知:二叉搜索树,又叫二叉排序树,二叉查找树。特点是:左子树的所有元素都小于等于根节点,右子树的所有节点都大于等于根节点。并且,二叉搜索树的中序遍历是升序排列的

    自己的思路:刚开始不知道二叉搜索树的性质;自己采用了优先队列的方式:

        public int kthSmallest(TreeNode root, int k){
            PriorityQueue<Integer> pqueue = new PriorityQueue<Integer>((s1,s2)->s2-s1);
            Queue<TreeNode> queue = new LinkedList<>();
            queue.add(root);
            while (!queue.isEmpty()){
                TreeNode node = queue.poll();
                pqueue.add(node.val);
                if (pqueue.size()>k){
                    pqueue.poll();
                }
                if (node.left != null){
                    queue.add(node.left);
                }
                if (node.right!=null){
                    queue.add(node.right);
                }
            }
            return pqueue.poll();
        }
    

    但是效率并不好。

    之后利用二叉搜索树的性质可以加快查找:利用栈来添加和移除元素。

        public int kthSmallest2(TreeNode root, int k){
            LinkedList<TreeNode> stack = new LinkedList<>();
            while (true){
                while (root!=null){
                    stack.add(root);
                    root = root.left;
                }
                root  = stack.removeLast();
                if (--k==0) return root.val;
                root = root.right;
            }
        }
    

    复杂度分析

    • 时间复杂度:O(H+k)
    • 空间复杂度:O(H+k) H:树的高度。
  • 相关阅读:
    【模板】高斯消元
    【洛谷P1730】最小密度路径
    【模板】矩阵乘法优化线性递推
    【洛谷P3723】礼物
    【洛谷P3338】力
    【模板】NTT
    【洛谷P1919】A*B Problem升级版
    测试理论基础(思维导图)
    Fiddler
    常用 Linux 命令
  • 原文地址:https://www.cnblogs.com/CodeJames/p/12841546.html
Copyright © 2011-2022 走看看