飞道的博客

【LintCode题解】谷歌面试题:BST中第K小的元素

656人阅读  评论(0)

题目描述

给一棵二叉搜索树,写一个 KthSmallest 函数来找到其中第 K 小的元素。

样例 1:


  
  1. 输入:{ 1, #,2},2
  2. 输出: 2
  3. 解释:
  4. 1
  5. \
  6. 2
  7. 第二小的元素是 2

样例 2:


  
  1. 输入:{2,1,3},1
  2. 输出:1
  3. 解释:
  4. 2
  5. / \
  6. 1 3
  7. 第一小的元素是1。

题解

时间复杂度 O(n) 最好最坏都是。
算法思想类似于 Quick Select。
这个算法的好处是,如果多次查询的话,给每个节点统计儿子个数这个过程只需要做一次。查询可以很快。

算法班还有更多面试解题套路,省去大量算法准备时间。


  
  1. public class Solution {
  2. /**
  3. * @param root: the given BST
  4. * @param k: the given k
  5. * @return: the kth smallest element in BST
  6. */
  7. public int kthSmallest(TreeNode root, int k) {
  8. Map<TreeNode, Integer> numOfChildren = new HashMap<>();
  9. countNodes(root, numOfChildren);
  10. return quickSelectOnTree(root, k, numOfChildren);
  11. }
  12. private int countNodes(TreeNode root, Map<TreeNode, Integer> numOfChildren) {
  13. if (root == null) {
  14. return 0;
  15. }
  16. int left = countNodes(root.left, numOfChildren);
  17. int right = countNodes(root.right, numOfChildren);
  18. numOfChildren.put(root, left + right + 1);
  19. return left + right + 1;
  20. }
  21. private int quickSelectOnTree(TreeNode root, int k, Map<TreeNode, Integer> numOfChildren) {
  22. if (root == null) {
  23. return - 1;
  24. }
  25. int left = root.left == null ? 0 : numOfChildren.get(root.left);
  26. if (left >= k) {
  27. return quickSelectOnTree(root.left, k, numOfChildren);
  28. }
  29. if (left + 1 == k) {
  30. return root.val;
  31. }
  32. return quickSelectOnTree(root.right, k - left - 1, numOfChildren);
  33. }
  34. }

 


转载:https://blog.csdn.net/JiuZhang_ninechapter/article/details/104431899
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场