Предполагается, что, как вы подозреваете, немного испорчено. Тип Node
, который вы определили, является прекрасным экземпляром двоичного дерева.
Джек упоминает, что вы хотите иметь тип Tree
вокруг всего набора узлов, чтобы обеспечить такие операции, как getRoot
, вставляет, удаляют и так далее. Это, конечно, не плохая идея, но это отнюдь не требование. Многие из этих операций могут идти по самому Node
, и вам необязательно иметь все эти операции; например, есть аргументы как для, так и против наличия операции getRoot
. Аргументом против него является то, что если у вас есть алгоритм, который в какой-то момент требует только поддерева, то объект Tree
, который держится за корень Node
, предотвращает сбор мусора Node
s, который вам больше не нужен.
Но в более общем случае, реальный вопрос, который нужно задать здесь заключается в следующем: какие из вещей, которые вы имеете дело в интерфейс, и которые являются реализация? Потому что одно дело, если вы хотите разоблачить бинарные деревья как интерфейс для вызывающих, а другое - если вы хотите предоставить какую-то конечную карту в качестве интерфейса, а двоичное дерево - это просто деталь реализации. В первом случае клиент «знал бы», что дерево будет либо null
, либо Node
со значением и ветвями, и ему будет разрешено, например, рекурсировать структуру дерева; в последнем случае все, что клиент «знал», это то, что ваш класс поддерживает некоторые формы операций put
, get
и delete
, но не может полагаться на то, что это хранится как дерево поиска. Во многих вариантах последнего случая вы действительно использовали бы тип Tree
как передний конец, чтобы скрыть узлы от клиентов. (Например, встроенный класс Java java.util.TreeMap
делает это.)
Таким образом, самый короткий ответ, действительно, это зависит.Несколько более длинный ответ зависит от того, что договор находится между реализацией бинарного дерева и его пользователями; какие вещи позволяют вызывающим абонентам допускать использование деревьев, какие детали бинарного дерева являются вещами, которые автор ожидает, чтобы их можно было изменить в будущем и т. д.
Использование защищенных переменных является преднамеренным. В целях уменьшения размера почты я удалил получатели и сеттеры. – Nyx