У меня есть задание, и мне нужна помощь с помощью метода.Двоичные деревья, возвращающие следующий узел в обход предварительного порядка
Так у меня есть дерево, как это:
A
/ \
B C
/ \/ \
D E F G
/ \
H I
/ \
J K
и мой метод:
public BinaryTree preorderNext(BinaryTree t, BinaryTree v, BinaryTree prev) {
prev = t;
if(t.getLeft() != null) {
preorderNext(t.getLeft(), v, prev);
}
if(t.getRight() != null) {
preorderNext(t.getRight(), v, prev);
}
if(prev == v) {
return t;
}
return null;
}
Лектор дал простую реализацию дерева. Класс называется BinaryTree, и если вы хотите связать узел с узлом, вы указываете, что такое правый и левый дочерний узел BinaryTree.
Узел имеет две ссылки (один слева и другой справа), и нет ссылки на голову.
Таким образом, с помощью текущего метода я могу успешно провести обход предварительных заказов, я протестировал, написав операторы печати того, что хранит элемент в узле.
Но когда я запускаю тесты, он сообщает мне, что следующий узел предзаказа из A есть B, а следующий узел предварительного заказа из K выдает исключение null, но это должно быть я?
Любые идеи о том, где я ошибаюсь? Переменная prev должна содержать ссылку на последний посещенный узел, поэтому, если он равен узлу v (который является указанным узлом, чтобы вернуть узел после v), не должен ли я получить следующий узел?
Можете изменить подпись функции? Гораздо проще иметь дело с 'root', чем с' t', 'v' и' prev'. Это связано с тем, что каждый ребенок дерева также является самим деревом. – arin
Что это значит? t является корнем дерева, в которое я могу пройти. – tenkii
Вы должны провести рекурсивный подход, а не передавать ранее полученную информацию методу; эта информация уже находится в стеке. Я отправлю ответ, чтобы объяснить мой подход для обхода порядка. – arin