Построй дерево(4)

  • 11
  • Недоступна
Любое дерево начинается с корня, поэтому не забудь в класс CustomTree добавить поле root типа Entry<String> c модификатором доступа по умолчанию. Инициируй его в конструкторе CustomTree, имя (elementName) не важно. Итак, основа дерева создана, пора тебе поработать немного самому. Вспомним как должно выглядеть наше дерево.
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (145)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий вы должны авторизоваться
Александр23 уровень, Москва
вторник, 15:11
Друзья! Я тоже долго тупил. Это нормально :D Очереди и рекурсии не нужны. У вас все есть. Если нужна помощь - пишите, подскажу. Вам почти все дано =) Нужно создать счетчик и список для хранения Entry Решил 1199. Не сдавайтесь. Сделайте сами. Удовлетворение и уважение к себе - бесценно.
TheDIP23 уровень, Киев
понедельник, 23:37
Долго приступал к задаче, прочитал много подсказок, просмотрел кучу статей, наконец-то родил. То на чем мой мозг стопорился (может кому-то поможет): 1) Я не понимал как сделать обход в add P.S. из условия сразу понятно что root надо декларировать в начале класса (и инициализировать в конструкторе) и что это будет первым элементом твоего листа (который надо в поле класса создать) Так вот, я не мог понять как обходить дерево и добавлять в лист элементы (модифаить левый и правый). Понял когда решил добавить элемент в методе add сразу в список. То есть, он в любом случае будет добавлен не смотря не на какие проверки, поэтому я решил сделать это в начале. Когда сделали, можно приступать к нашим Левым и Правым ( + отцовским) "Баранам". Проходим с помощью for по списку сначала, помним что у каждого нашего элемента в списке есть поля для ссылок на Левый, Правый и Отцовский обьект. Начинаем расставлять, левый есть ? правый есть? --- значение TRUE (можно добавить) - маркаем что
temp.availableToAddLeftChildren = false;  ----- то есть уже будет добавлен = заблокирован для дальнейшего добавления.
Пример: temp = list.get(i) - в цикле. то есть temp переменная для итерации 1) Добавляем в список 1 элемент ( + root уже там) = 2 элемента 2) проходим, смотрим что у рута temp.availableToAddLeftChildren = true; and temp.availableToAddRightChildren = true; 3)Блокируем левого чайлда = маркнули что он есть -- temp.availableToAddLeftChildren = false; 4) приасайнили чайлда к руту (левое крыло) + добавили парента
newElement.parent = temp;
5) поехали дальше по аналогии следующий элемент (будет заблокировано правое крыло и приасайнен правый элемент) + тоже добавили parent Много текста, не уверен что описал красиво, если кому-то нужна помощь то пишите в личку.
13Black33 уровень, Москва
воскресенье, 20:52
Ощущения как будто босса дарк соулс победил. Самым сложным была реализация метода add. Делал через рекурсию. Алгоритм такой 1) Проверяем есть ли место для добавления детей и добавляем правого или левого. 2) Если места нет проверяем детей(сначала левого, потому что строим слева) и в зависимости у кого есть место вызываем с тем ребенком самого себя. 3) Если у детей места нет. Тут пришлось ввести два метода по расчету длины левой и правой ветки. 3.1 Если у нашего ентри ветки влево и вправо равны вызываем самого себя с левым ребенком(строим слева направо) 3.2 Если нет то спрашиваем у левого ребенка равны ли у него ветки. Вызываем самого себя с правым ребенком 3.3 Если не равны с левым. Все до чего смог додуматься за часов 6 наверно 1197й
Арсен26 уровень, Алматы
1 апреля, 08:31
Отправляю такой на проверку , думаю щас как засветит красным , а тут такое счастье!!)) 1171
Дворник25 уровень
31 марта, 14:14
Всего эту задачу решили 1170 учеников.
Арсен26 уровень, Алматы
1 апреля, 08:46
за сутки выходит всего +1 решение , учитывая мое. Не густо.
6 марта, 10:42
1109. В ссылках ниже что то есть для общего понимания, но ничего не пригодилось. Прочитал их все и пытался реализовать задачу с их помощью. Итог: валик не принимал, хотя вроде бы всё работало. Инфа из ссылок меня запутала и почти один день выпал из жизни. Сами комментарии пригодились больше. Написал своё решение с использованием переменных, которые даются в классе Entry (не использовал только lineNumber), хотя многие не понимают для чего они нужны. Думаю из всех возможных вариантов, тот который дают разрабы задачи самый практичный и понятный в данном случае, а быстрее он или нет не знаю. Также не знаю правильно ли я всё реализовал. Кто как и я не понял ничего из ссылок ниже, особенно из ссылки на хабре, коротко напишу как делал: 1. Добавил дополнительную переменную - список для обьектов Entry. В него в последствии добавлял все новые элементы. При инициализации нужно обязательно добавить root как первый элемент и равный "0". 2. В методе add добавляем (пока не в список) новый элемент Entry, делаем обход нашего списка, чекаем элемент с помощью checkChildren, и смотрим есть ли у элемента isAvailableToAddChildren, если да, то проверяем на наличие чилдренов. И соответственно там где их нет добавляем, попутно добавляя этот элемент в список, при этом присваивая переменной parent нового элемента - родителя, который мы чекали. 3. Количество элементов берём с помощью размера списка минус 1. 4. Родителей вычисляем с помощью переменной parent нужного элемента списка. Решение получилось небольшим, но получил много удовольствия. PS кто дошёл до этого задания и не особо владеет данной темой, совет делать самим, а не смотреть готовое решение. Но приготовьтесь к долгому и "весёлому" времяпровождению и новым открытиям)
Alexey28 уровень, Минск
9 марта, 22:47
У меня валик ругается на 4 пункт. Элемент списка.парент.нейм. Все чётенько возвращается. Закрылся ифами и от не попадающих в диапазон запросов - не помогает. --- Хех, прочитал в комментах о том, что имя элемента не обязательно номер и переделал - приняло) 1120-й )
Юрий34 уровень, Минск
14 февраля, 17:14
фуух,поделюсь и я своими радостными впечатлениями,я был 1073им решившим так чего то и не понял зачем методы checkChildren и isAvailableToAddChildren добавил только лист для элементов которые перебирал через очередь,перебирал слева направо по уровням с начала было жутко непонятно,но потом хорошо подумал и решил,чистого времени решения где то часов 5
Aleksandr35 уровень
2 января, 00:23
Я как почитал и посмотрел различные решения у коллег учащихся, просто ужаснулся. Зачем вы так все усложняете? Зачем эти все мапы и очереди, куча переменных и списков? Я добавил только одну переменную для подсчета элементов в дереве и один лист для хранения всех элементов, остальное все у нас есть. Посмотрите внимательно наши методы и те переменные, которые есть в классе class Entry<T>. Не ищите сложных путей, идите от простого к сложному, а не наоборот. У меня решение заняло пол часа и пол часа читал комменты, да смотрел решения, чтоб узнать, как делали другие, для общего развития.
Vitaly Khan36 уровень
27 января, 10:46
интересно было бы взглянуть на ваше решение... с очередью получается изящно реализовать обход, на мой взгляд. интересно сравнить с вашим вариантом со списком.
30 января, 14:53
Просто я почему-то решил сделать без дополнительных переменных в классе. И, видимо, зря, ваш вариант действительно лучше, спасибо за пример)))
DeH4uK34 уровень, Харьков
30 января, 15:21
Инкапсуляция - она, такая)) Думаю, в нашем случае вполне оригинально использовать приватное поле ArrayList<Entry> и дополнительное поле - private transient int size = 0 - для которого создать геттер, и метод size() реализовать именно с помощью этой переменной. Успехов в обучении!)
Леонид Шевченко37 уровень, Санкт-Петербург
8 февраля, 14:04
Отличный камент. Разобрался благодаря ему на все 100% и без лишних заморочек. Люто плюсую
Sipa Barskij26 уровень
28 марта, 18:17
Top comment. Стоит только понять, что нужно ввести две переменных (лист и счетчик), и все реализовать встроенными методами, все решается на ура. До этого, не понимал с какой стороны подойти
11 декабря 2018, 03:48
нужно внимательность там где ожидают конструктор без параметров не создайте нечаянно его с параметрами - ошибки будут но указывать они будут просто в потолок
Valeriy2941 уровень
7 декабря 2018, 19:40
Обидно, сделал все правильно с первой попытки, но не принимало... приняло с такой инициализацией:
public CustomTree() {
    this.root = new Entry<>("0");
}
30 января, 06:15
Такая же фигня)) А ещё root не учитывается при подсчёте в size() (по условию сказано, что считать только то, что добавлено методом add()), но это как-то нелогично. Исправил это, и всё заработало. Обход дерева при поиске родителя и добавлении элемента делал сначала по линии слева направо, потом опускался на 1 уровень вниз.
Андрей32 уровень, Одесса
13 февраля, 14:51
Такая же фигня))))))