Поиск минимального значения 2-3-4 дерева

Во-первых, этот вопрос не является домашним заданием. В настоящее время я читаю книгу Роберта Лафорда "Структуры данных и алгоритмы второго издания". В главе 10 мы узнали о 2-3-4 деревьях, а затем попросили написать метод, чтобы найти минимальное значение в указанном дереве.

С точки зрения концепции, я понимаю, где минимальное значение. Это только левый элемент данных в листе.

С точки зрения программирования я немного запутался в том, как реализовать метод для поиска этого элемента данных. У меня есть логическое значение, которое может определить, является ли узел листом. Так что я изначально сделал это:

  public long minValue() {  Узел curNode = root;//текущий узел = корень  long min = curNode.getMin();  while (! curNode.isLeaf()) {//в то время как текущий узел НЕ является листом      curNode = getNextChild (curNode, min);  }//завершаем пока  return min;
}//end minValue()
Код>

Что это делает (по крайней мере, то, что я думаю, что он должен делать), создайте curNode, который начинается с корневого узла. Затем создайте значение min, которое хранит curNode.getMin. getMin() просто получает значение в массиве по индексу 0 (где должно быть выполнено самое низкое значение). Тогда, пока текущий узел не является листом, мы должны перейти к следующему ребенку с минимальной точки. Как только текущий узел является листом, он должен вернуть минимальное значение.

Это не работает. Кто-нибудь есть идея о том, как это реализовать? Советы или предложения или что-то еще?

Изменить: чтобы увидеть каждый из классов и как они взаимодействуют, вот ссылки на каждый отдельный класс. Я поместил метод минимального значения в класс Tree234

DataItem, Node, Tree234 и где программа запущена, Tree234App

3
задан Alex 29 июля '14 в 4:21
источник поделиться

2 ответов

Во-первых, для лучшей помощи скорее, SSCCE, который дает нам минимальную реализацию всей вашей программы - что-то, что мы можем сделать в нашей собственной среде IDE, и запуститься, чтобы посмотреть, что происходит. Трудно сказать, почему "это не работает", когда мы видим только этот бит вашего кода.

Во-вторых, вам нужно уточнить, что означает "это не работает" - то есть сказать нам, что именно он делает или не делает это неожиданно. Вместо того, чтобы вы это сделали, как мы можем сказать вам с какой-либо степенью уверенности, почему это так.

Однако одна вещь выпрыгивает: вы создаете min как самый маленький (прямой) дочерний корень node, затем (предположительно) итерации по дереву, чтобы найти самый левый элемент в нем, но затем вы возвращаете то же самое значение min, которое вы создали изначально. Другими словами, хотя ваша итеративная процедура может делать именно то, что вы хотите, вы ничего не делаете с возвращаемым значением в результате этого.

Я подозреваю, что вам нужно сделать что-то вроде:

  public long minValue() {     Узел curNode = root;     long min = curNode.getMin();     while (! curNode.isLeaf()) {//          curNode = getNextChild (curNode, min);//не сразу понятно, что здесь делает мин.      }      //curNode  теперь является самым левым нелистовым элементом в дереве      min = curNode.getMin();      return min;
Код>

Обратите внимание, что единственное изменение, которое я сделал, это вставить строку над оператором return, которая переназначает min минимальное значение, прикрепленное к самому левому элементу в дереве.

2
ответ дан drewmoore 29 июля '14 в 4:49
источник поделиться

Для большей эффективности обратите внимание, что вам не нужно вызывать getNextChild (curNode, min), поскольку элементы в node всегда сортируются в порядке возрастания в 2-3-4 дерева и наименьший элемент всегда находится в индексе 0. В начале также не требуется декларация мин. Таким образом, ваша программа может быть такой:

  public long minValue() {   node curNode = root;   while (! curNode.isLeaf()) {       curNode = curNode.getChild(0);   }   return curNode.getMin();
}
Код>
0
ответ дан Yogesh Umesh Vaity 07 апр. '16 в 12:35
источник поделиться

Другие вопросы по меткам