【发布时间】:2018-11-29 00:16:23
【问题描述】:
我今天面临以下面试问题,我想出了下面提到的递归和迭代解决方案,但不知何故面试官不高兴。我不知道为什么。
给定一棵二叉搜索树,找出其中第 k 个最小的元素。
有没有更好的方法以递归或迭代的方式解决这个问题?
/*****************************************************
*
* Kth Smallest Recursive
*
******************************************************/
public int kthSmallestRecursive(TreeNode root, int k) {
int count = countNodes(root.left);
if (k <= count) {
return kthSmallestRecursive(root.left, k);
} else if (k > count + 1) {
return kthSmallestRecursive(root.right, k - 1 - count);
}
return root.data;
}
public int countNodes(TreeNode n) {
if (n == null)
return 0;
return 1 + countNodes(n.left) + countNodes(n.right);
}
/*****************************************************
*
* Kth Smallest Iterative
*
******************************************************/
public int kthSmallestIterative(TreeNode root, int k) {
Stack<TreeNode> st = new Stack<>();
while (root != null) {
st.push(root);
root = root.left;
}
while (k != 0) {
TreeNode n = st.pop();
k--;
if (k == 0)
return n.data;
TreeNode right = n.right;
while (right != null) {
st.push(right);
right = right.left;
}
}
return -1;
}
我提到了上述解决方案的复杂性为 O(depth of node),即 O(log n)。
我的迭代版本占用了额外的空间。有没有什么办法不用多余的空间?
【问题讨论】:
-
你当然不能比 log n 做得更好。他们有没有提到任何具体的事情?
-
你怎么知道他不开心?
-
打一通
countNodes需要多长时间?计算树中的所有节点(或树中的一半节点)需要多长时间?这不是 O(log n)。此外,您不必要地多次查看相同的节点 - 您计算它们,然后递归,然后再次计算它们,然后递归,等等。 -
您只需要中序遍历中的第 k 个元素。您的迭代版本似乎就是这样做的。递归版本效率不高。
-
@Dukeling 所以我的迭代版本很好,只有递归版本有问题,对吗?因为我多次检查相同的节点你能帮我理解为什么它不是 O(log n)。
标签: java algorithm data-structures binary-search-tree