Поиск минимального значения 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

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

2 ответов

Во-первых, для лучшей помощи, скорее всего, опубликуйте 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 минимальное значение, прикрепленное к самому левому элементу в дереве.

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
источник поделиться

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