Я предполагаю, что это домашнее задание, поэтому я дам несколько указателей вместо кода.
- ваш метод трассировки выполняет рекурсивное снижение, поэтому стек не нужен - вы можете построить структуру пути при возврате из найденного узла
- если ваш метод использует логическое значение или возвращаемое значение List, вы можете напечатать путь при возврате или создать список с узлами для печати после того, как метод поиска вернет
Редактировать :
Если нужен путь к корневому узлу, достаточно простого логического возврата:
private boolean trace(Node parent, Node node) {
boolean found = (node.data == parent.data)
if (!found && parent.left != null) {
found = trace(parent.left, node);
}
if (!found && parent.right != null){
found = trace(parent.right, node);
}
if (found) {
System.out.println(parent.data);
}
return found;
}
Если вам нужен путь от корня к узлу, вы можете передать список для получения узлов в следующем порядке:
private boolean trace(Node parent, Node node, List path) {
boolean found = (node.data == parent.data)
if (!found && parent.left != null) {
found = trace(parent.left, node);
}
if (!found && parent.right != null){
found = trace(parent.right, node);
}
if (found) {
path.add(0, parent);
}
return found;
}
в качестве альтернативы вы можете построить путь на обратном пути и вернуться в виде списка.
private List trace(Node parent, Node node) {
List path = null;
if (null != node) {
if (node.data == parent.data) {
path = new ArrayList();
} else {
path = trace(parent.left, node);
if (null == path) {
path = trace(parent.right, node);
}
}
if (null != path) {
path.add(0, parent);
}
}
return path;
}