Из минусов - рекурсия. Как вы потом узнаете , на проектах рекурсию не используют(крайне редко).
Решение от JR заслуживает чтобы его не просто глянуть а и изучить. Во первых когда придете на коммерческий проект - там будет такая же требухня. И вам никто не даст разрешение на удаление всего и написать все с чистого листка(правило - работает не трогай). Привыкайте к этому. Вам придется разбираться и еще самому догавнокодывать...
Фуух, спустя два дня всё-таки закрыл эту задачу. Что могу сказать:
1. Ощущения непередаваемые. Когда решаешь "зеленые" или "желтые" задачи, тоже получаешь лёгкое удовлетворение, но это не сравнится по сравнению с закрытием сложной "красной" задачи, которую решал несколько часов/дней/недель.
2. Стоит ли решать? ДА. Здесь согласен с very junior java developer, эта задача очень сильно прокачивает абстрактное мышление и не ограничивает в выборе реализации. Я например решил используя два списка.
3. Доп. материалы.
Мне очень помог Р. Лафоре и его "Алгоритмы и структуры данных", а конкретно часть про двоичные деревья.
4. 16 элемент добавляйте к 1, валидатор пропускает.
5. Впервые у меня в коде меньше строк чем в правильном решении!😅
5. Ну и конечно желаю удачи в обучении. Если вы здесь, значит вы уже прошли половину пути!
Решать однозначно, но своим методом. Заранее правильное решение лучше не смотреть, оно слишком накрученное. Все решается значительно проще и короче. Максимум, что можно глянуть в привильном решение это переменные, для понимания общей логики (и того как обьекты хранятся и между собой связанны). И да, прямо хорошо разберитесь в условиях. Они хреновые, согласен, ориентируйтесь на картинки.
2JR:
извините, вообще не понял что в этих задачах происходит, что требуется и как их решать. и даже не смог разобраться в правильном решении. концепцию использования "queue" не уловил.
просьба пересмотреть этот блок.
в этих задачках использование queue очень помогает например метод add сначала добавляем в queue корневой узел root потом пока queue не пустой! получаем первый добавленный элемент и удаляем его из queue это у нас root у корневого узла проверяем если нет возможности иметь потомков и нет ни одного потомка то нужно сделать так чтобы он имел возможность иметь потомков availableToAddLeftChildren = true availableToAddRightChildren = true;
если это условие не проходит проверяем можем ли мы добавить левого потомка если нет то правого если нет значит уже есть левый и правый потомок добавляем в очередь сначала левого потомка потом правого и так далее. queue желательно использовать локальные на все методы свои
Условия написаны так, что в деталях не понятно чего требуется сделать. Проще выполнить задачу своими методами чисто для себя, как сам понимаешь условия и наплевать на валидатор, двигать дальше.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ