Как видно из заголовка, мне нужно обрезать двоичное дерево на основе заданного минимального и максимального значения. Каждый узел хранит значение и левый / правый узел. Я могу определить частные вспомогательные методы для решения этой проблемы, но в противном случае я не могу вызывать какие-либо другие методы класса или создавать какие-либо структуры данных, такие как массивы, списки и т. Д.
Пример будет выглядеть так:
overallRoot
_____[50]____________________
/ \
__________[38] _______________[90]
/ \ /
_[14] [42] [54]_____
/ \ \
[8] [20] [72]
\ / \
[26] [61] [83]
trim(52, 65);
должен вернуть:
overallRoot
[54]
\
[61]
Мое попытанное решение имеет три метода:
public void trim(int min, int max) {
rootFinder(overallRoot, min, max);
}
Первый рекурсивный метод отлично находит новый корень.
private void rootFinder(IntTreeNode node, int min, int max) {
if (node == null)
return;
if (overallRoot.data < min) {
node = overallRoot = node.right;
rootFinder(node, min, max);
}
else if (overallRoot.data > max) {
node = overallRoot = node.left;
rootFinder(node, min, max);
}
else
cutter(overallRoot, min, max);
}
Этот второй метод должен исключить любые другие узлы, не входящие в мин / макс, но он не работает, как я надеюсь.
private void cutter(IntTreeNode node, int min, int max) {
if (node == null)
return;
if (node.data <= min) {
node.left = null;
}
if (node.data >= max) {
node.right = null;
}
if (node.data < min) {
node = node.right;
}
if (node.data > max) {
node = node.left;
}
cutter(node.left, min, max);
cutter(node.right, min, max);
}
Возвращает:
overallRoot
[54]_____
\
[72]
/
[61]
Любая помощь приветствуется. Не стесняйтесь просить дальнейших объяснений по мере необходимости.