Прежде всего, что мы должны найти. 1, Сначала вы должны получить узел (от корня BST). 2. Вам нужно получить узлы, которые находятся ниже него и отдаленные k. 3. Вы должны получить предка, который находится над ним над ним. 4. Вы должны получить узлы, которые на расстоянии k-го от него. (В том же уровне или на другом уровне)
A(8)
/ \
B(6) C(22)
/ \ /\
D(5) E(7) F(17) G(26)
/\ \
(15)H I(19) N(29)
/ \
(14) K L(20)
Ока рассмотрит дерево является БСТ Дерево (А, В, С д не в последовательности BST, * считать их узел ссылка на идентичность узел, а не значение *) Я установил числа, которые представляют значения.
Еще одно соображение. Так как это объявлено BST Tree. нет родительских указателей. *
У вас есть корень A дерева. с номером 17 и задано значение k = 2. Сначала для номера 17 получить ссылку (F) Для k = 2, то есть от 2-х узловых расстояний, получите все узлы дерева из F. в качестве дециентов F вы должны обнаружить K (14) и L (20) как по силе F вам нужно получить Node A. снова вам нужно получить Node G (расстояние между двумя узлами) (хотя нет родительского указателя, который вам нужно получить).
Шаг за шагом сначала для номера -> 17 получить ссылку F (у вас есть корень) сделать простой двоичный поиск.
ArrayList get_it(Node root_node, int number) {
node = root_node;
if (node ==null)
throw new IllegarArgumentException("null root node");
ArrayList pathtracker = new ArrayList();
//is the root node matches
pathtracker.add(node); // fix
if(node.data=number) // fix
return pathtracker;
while(node !=null) {
if (node.data==number){
return pathtracker;
}
if (node.data >= number){
node=node.left;
}
else{
node=node.right;
}
pathtracker.add(node);
} // end of while loop
return new ArrayList(); //search failed node is not present.
// returning empty arrayList
}
Теперь мы будем использовать пут-крэкер. У этого есть узлы пути от корня до этого узла. 0-й узел - корень, длина() - 1-й узел - это узел, который у нас есть .
for (int i = pathtracker.length() - 1 , depth=k ;
(depth => 0 && i => 0) ; i--,depth--){
if (i == pathtracker.length() - 1) {//first case
printnodeDistancek(pathtracker.get(i), depth);
}else {
if(pathtracker.get(i).left ! = pathtracker.get(i+1)){
printnodeDistancek(pathtracker.get(i).left, depth);
}else{
printnodeDistancek(pathtracker.get(i).right, depth);
}
} // end of else block
} // end of loop
void printnodeDistancek(node n, k) {
if (node==null)
return;
if (k = 0) {
print node.data;
return;
}
printnodeDistancek(n.left, k-1);
printodeDistanceK(node.right, k-1);
}
Количество дано 17 (F узел) и Теперь, если к = 3 это должно напечатать N и B. , если К = 4, это должно напечатать D (5) и Е97)
Просто интересно, не знаете ли вы, что у нас есть вопросы по поводу интервью? – MAK
На самом деле это был не вопрос Google (трюк, чтобы получить ответы). Это решение, которое я подумал, вернувшись домой к этому вопросу. Это был вопрос, основанный на применении, на который я дал ужасный ответ (я использовал хеш тогда, а затем понял, что BST лучше), и, конечно же, я был отклонен после 5 крутых раундов. Я должен удалить Goggle, иначе я в конечном итоге испортил бы свои шансы на следующий раз. : D – user2223032
Невозможно иметь алгоритм с временной сложностью меньше O (n), если BST не сбалансирован! –