当前位置: 移动技术网 > IT编程>开发语言>Java > 求得二叉搜索树的第k小的元素

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

2020年05月07日  | 移动技术网IT编程  | 我要评论

日籍商人被捕,燕福龙有两个女儿,新视野影院

求得二叉搜索树的第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:树的高度。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网