Сегодня я столкнулся с вопросом об интервью ниже, и я нашел рекурсивное и итеративное решение, как упомянуто ниже, но каким-то образом интервьюер не был доволен.Я не уверен, почему.
Учитывая двоичное дерево поиска, найдите в нем 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 (глубина узла), которая равна O (log n).
Мой итеративныйверсия занимает дополнительное место.Есть ли способ сделать это без лишних пробелов?