Вы можете реализовать метод size()
в качестве члена ArrayTreeNode
. Используйте рекурсию. Размер узла равен 1 плюс сумма размеров дочерних узлов.
Так внутри метода size()
у вас есть два случая:
Если узел является листом, возвращение 1. Здесь не рекурсивный вызов.
Если у узла есть дети, вызовите метод size() для всех детей, вычислите сумму, добавьте 1 для узла и верните это значение.
КПП. почему у вас есть как tree
, так и root
атрибутов в классе ArrayTree
? Не достаточно корневой узел? Почему у вас есть отдельный класс ArrayTree
? ArrayTreeNode
для себя уже является деревом.
Где вы устанавливаете атрибут parent
вашего класса ArrayTreeNode
? Не было бы лучше, если бы вы установили родительский элемент внутри метода addChild()
, чтобы гарантировать, что parent
всегда действителен?
Update:
Хорошо, вы просили пример. Я думаю, что если вы не привыкли к рекурсии, не так-то просто обдумать ее.
Это метод класса ArrayTreeNode
:
public int size() {
int sum = 1; // Count at least this node
// Ask every child for its size. If this node is a leaf,
// then no recursive call happens.
// Otherwise call the size() method recursively for ervery
// child node. The child's size() method may also call its
// own childs size() method, adding another level of recursion.
// But we can be sure that the recursion comes to an end because
// at every leaf the simple answer will be 1.
for(ArrayTreeNode<E> child: children) {
sum += child.size();
}
// return our calculated size.
return sum;
}
вы имели в виду 'счетчик + = 'вместо' 'счетчик =? – Thilo
Не удаляйте и не удаляйте текст вопроса, когда вы определяете ответ. Если вы хотите отделить этот вопрос от себя, отметьте его модератором. Если вы хотите сказать, что оно исправлено, ответьте на вопрос и отметьте его как принятый или отметьте ответ, который решил проблему для вас. Ваши вопросы не только для вас, но и для всех, кто ищет аналогичную проблему. –
Я изменил имя в настройках своей учетной записи. Задача решена. –