Для бинарного объекта дерева я реализую с закрытыми полями
X key;
Y value;
Tree<X,Y> left;
Tree<X,Y> right;
У меня есть метод public Tree<X,Y> subset(X startKey, X endKey)
, который должен возвращать дерево, включая все ключи между узлом с startKey
и узлом с endKey
, и их соответствующие значения. Этот метод также должен быть выполнен с использованием рекурсии.
Проблема, с которой я сталкиваюсь, заключается в том, что я не могу найти способ получить дерево (которое, вероятно, будет выглядеть как LinkedList), которое заканчивается на endKey
, без учета endKey.left
и endKey.right
. Я решил начать с рекурсивного вызова метода в левом или правом дереве корня в зависимости от того, больше или меньше startKey корневого ключа, поэтому:
if (this.key.compareTo(startKey) < 0) this.right.subset(startKey, endKey);
else if (this.key.compareTo(startKey > 0) this.right.subset(startKey, endKey);
Это продолжит навигацию по дереву, пока оно не достигнет узла, содержащего ключ startKey
. Когда я дохожу до этого, я копирую this
в новое дерево, чтобы избежать редактирования исходного дерева. Это новое дерево имеет узел с startKey
в качестве его корня, а затем имеет те же дочерние элементы, что и оригинал.
Вот где я застрял. Я знаю, что мне придется столкнуться с проблемами, связанными с переходом на endKey
, в котором я остановлюсь и не включу endKey.left
или endKey.right
и верну правильное подмножество, даже если метод "раскручивается" из рекурсивные вызовы. Я думаю, что если я хочу остановиться на endKey
, мне придется каким-то образом сохранить ссылку на его родительский узел, чтобы я мог установить левый или правый дочерний узел родительского узла на пару ключ / значение, чтобы отрезать остальных детей endKey
. Однако, поскольку у меня на самом деле нет объектов узлов, и я не могу добавить какие-либо методы или конструкторы, я не знаю, как я смогу поддерживать ссылку на родительское дерево. Я также не знаю, как попытаться осуществить это, сохранив startKey
в качестве корня нового дерева.
Другими словами, я думаю, что мне удалось получить подмножество дерева, которое начинается на более низком уровне и продолжается до основания исходного дерева. Как я могу рекурсивно удалить ненужных детей в нижней части и вернуть мое новое подмножество?