Вот мой Узел класс:Симметричных итератор для бинарного дерева - ява
private class Node {
private int key; // the key field
private Object data; // the rest of the data item
private Node left; // reference to the left child/subtree
private Node right; // reference to the right child/subtree
private Node parent; // reference to the parent
.. и так далее.
Это Симметричное итератор со следующими() и hasNext() методами:
private class inorderIterator implements LinkedTreeIterator {
private Node nextNode;
private inorderIterator() {
// The traversal starts with the root node.
nextNode = root;
if(nextNode == null)
return;
while (nextNode.left != null)
nextNode = nextNode.left;
}
public boolean hasNext() {
return (nextNode != null);
}
public int next() {
if(!hasNext())
throw new NoSuchElementException();
Node r = nextNode;
if (nextNode.right != null) {
nextNode = nextNode.right;
while (nextNode.left != null) {
nextNode = nextNode.left;
}
return r.key;
} else while (true) {
if (nextNode.parent == null) {
nextNode = null;
return r.key;
}
if (nextNode.parent.left == nextNode) {
nextNode = nextNode.parent;
return r.key;
}
nextNode = nextNode.parent;
}
return r.key;
}
}
Проблема заключается в том, что только когда печатают левые узлы на левом поддерево. Например, для дерева с корневым узлом 17, левым узлом 15 и правым узлом 19 оно печатает только 15.
Поэтому он никогда не входит в правильное поддерево.
Я предполагаю, что проблема связана с частью else while (true)
, но я не могу понять, как это исправить.
Вы пытались использовать отладчик, чтобы увидеть шаг за шагом, что он делает? – RealSkeptic