Я тренируюсь на экзамене по структурам данных и работаю над вопросом: «Напишите алгоритм, который находит kth самое высокое значение узла в двоичном дереве поиска T .алгоритм должен работать в O (d), где d - глубина дерева. "
Я пришел с этим (через несколько часов) и не уверен насчет времени выполнения, я дважды прошел дерево,это 2d и поэтому просто d?Я также надеялся получить несколько советов о том, как уменьшить количество используемых мной методов (если это возможно).
Вот мой ответ, использующий рекурсивный вспомогательный метод для подсчета количества узлов в дереве ипорядок DFS:
public int getKthHighestValue(Node root, int k) {
int nodeCount = countNodes(root);
if (k < 0 || k > nodeCount)
return -1;
ArrayList<Integer> nodeList = new ArrayList<>();
getNodeValues(root, nodeList);
return nodeList.get(k-1);
}
private void getNodeValues(Node root, ArrayList<Integer> nodeList) {
if (root == null) {
return;
}
getNodeValues(root.getLeft(), nodeList);
nodeList.add(root.getValue());
getNodeValues(root.getRight(), nodeList);
}
private int countNodes(Node root) {
if (root == null) {
return 0;
}
return 1 + countNodes(root.getLeft()) + countNodes(root.getRight());
}