Когда ваше дерево пусто, узел добавляется к нему правильно.Первая функция add(int data)
в порядке.
Проблема существует со второй функцией add(int data, Node<Integer> node)
.Если в дереве уже есть элемент, вызывается этот метод.Если переданный узел больше или меньше переданного значения, то функция вызывается снова с левым или правым потомком текущего узла.Это значение может быть (будет в конечном итоге) нулевым.Это приводит к созданию узла в базовом случае вашего метода, что приводит к удовлетворению этого условия data == node.data
, поскольку узел действительно был создан со значением данных.Следовательно, вы получаете сообщение об ошибке.
Чтобы исправить это, вторая функция может быть изменена, как показано ниже:
private void add(int data, Node<Integer> node) {
if (data < node.data) {
if (node.left != null) {
add(data, node.left);
} else {
node.left = new Node<>(data);
}
}
else if (data > node.data) {
if (node.right != null) {
add(data, node.right);
} else {
node.right = new Node<>(data);
}
add(data, node.right);
}
else if (data == node.data) {
System.out.println("Duplicate. This value cannot be added to the tree.");
}
}
Смотрите, что базовый случай был удален.Если когда-либо встречается базовый случай не дает нам ссылку на какой-либо узел дерева.Следовательно, добавление data
к дереву невозможно (аргумент узла никогда не должен быть нулевым).
Кроме того, код добавляет data
в качестве дочернего элемента к node
, еслиребенок нольЭто гарантирует, что метод не является рекурсивным с нулевым аргументом node
и добавляет data
на его законное место, что более важно.