Поиск минимального значения 2-3-4 дерева
Во-первых, этот вопрос не является домашним заданием. В настоящее время я читаю книгу Роберта Лафорда "Структуры данных и алгоритмы второго издания". В главе 10 мы узнали о 2-3-4 деревьях, а затем попросили написать метод, чтобы найти минимальное значение в указанном дереве.
С точки зрения концепции, я понимаю, где минимальное значение. Это только левый элемент данных в листе.
С точки зрения программирования я немного запутался в том, как реализовать метод для поиска этого элемента данных. У меня есть логическое значение, которое может определить, является ли node листом. Так что я изначально сделал это:
public long minValue() {
Node curNode = root; // current node = root
long min = curNode.getMin();
while(!curNode.isLeaf()) { // while current node is NOT a leaf
curNode = getNextChild(curNode, min);
} // end while
return min;
} // end minValue()
Что это делает (по крайней мере, я думаю, что это должно сделать, создается curNode, начинающийся с корня node). Затем создайте значение min, которое хранит curNode.getMin. getMin() просто получает значение в массиве при индексе 0 (где должно быть выполнено самое низкое значение). Тогда, когда текущий node не является листом, мы должны перейти к следующему ребенку с минимальной точки. Как только текущий node является листом, он должен вернуть минимальное значение.
Это не работает. Кто-нибудь есть идея о том, как это реализовать? Советы или предложения или что-то еще?
Изменить: чтобы увидеть каждый из классов и как они взаимодействуют, вот ссылки на каждый отдельный класс. Я поместил метод минимального значения в класс Tree234
DataItem, Node, Tree234 и где программа запущена, Tree234App
Во-первых, для лучшей помощи, скорее всего, опубликуйте SSCCE, который дает нам минимальную реализацию всей вашей программы - что-то, что мы можем сделать c/p в нашей собственной среде IDE и запустите себя, чтобы посмотреть, что происходит. Трудно сказать, почему "это не работает", когда мы видим только этот бит вашего кода.
Во-вторых, вам нужно уточнить, что означает "это не работает" - то есть сказать нам, что именно он делает или не делает это неожиданно. Вместо того, чтобы вы это сделали, как мы можем сказать вам с какой-либо степенью уверенности, почему это так.
Однако одна вещь выпрыгивает: вы создаете min
как самый маленький (прямой) дочерний корень node, затем (предположительно) итерации через дерево, чтобы найти в нем самый левый элемент, но то вы возвращаете то же самое значение min
, которое вы создали изначально. Другими словами, хотя ваша итеративная процедура может делать именно то, что вы хотите, вы ничего не делаете с возвращаемым значением в результате этого.
Я подозреваю, что вам нужно сделать что-то вроде:
public long minValue() {
Node curNode = root;
long min = curNode.getMin();
while(!curNode.isLeaf()) { //
curNode = getNextChild(curNode, min); //it not immediately clear what min is doing here
}
//curNode is now the leftmost non-leaf element in the tree
min = curNode.getMin();
return min;
Обратите внимание, что единственное изменение, которое я сделал, это вставить строку над оператором return, которая переназначает min
минимальное значение, прикрепленное к самому левому элементу в дереве.
Для большей эффективности обратите внимание, что вам не нужно вызывать getNextChild(curNode, min)
, так как элементы в node всегда сортируются в порядке возрастания в дереве 2-3-4, а наименьший элемент всегда находится в индексе 0
. В начале также не требуется декларация мин. Таким образом, ваша программа может быть такой:
public long minValue() {
Node curNode = root;
while (!curNode.isLeaf()) {
curNode = curNode.getChild(0);
}
return curNode.getMin();
}
Другие вопросы по меткам java algorithm minimum 2-3-4-tree или Задайте вопрос