求得二叉搜索树的第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:树的高度。
标签:node,pqueue,二叉,queue,add,求得,搜索,root 来源: https://www.cnblogs.com/codexwj/p/12841546.html