Ответ 1
Первый элемент поддерева всегда самый левый. Следующий элемент после элемента - это первый элемент его правого поддерева. Если элемент не имеет правильного дочернего элемента, следующий элемент является первым правым предком элемента. Если элемент не имеет ни правого ребенка, ни правого предка, он является самым правым элементом и длится на итерации.
Надеюсь, мой код читается человеком и охватывает все случаи.
public class TreeIterator {
private Node next;
public TreeIterator(Node root) {
next = root;
if(next == null)
return;
while (next.left != null)
next = next.left;
}
public boolean hasNext(){
return next != null;
}
public Node next(){
if(!hasNext()) throw new NoSuchElementException();
Node r = next;
// If you can walk right, walk right, then fully left.
// otherwise, walk up until you come from left.
if(next.right != null) {
next = next.right;
while (next.left != null)
next = next.left;
return r;
}
while(true) {
if(next.parent == null) {
next = null;
return r;
}
if(next.parent.left == next) {
next = next.parent;
return r;
}
next = next.parent;
}
}
}
Рассмотрим следующее дерево:
d
/ \
b f
/ \ / \
a c e g
- Первый элемент "полностью удален от корня"
-
a
не имеет правильного дочернего элемента, поэтому следующий элемент "вверх, пока вы не придете слева" -
b
имеет правильный дочерний элемент, поэтому итерацияb
правого поддерева -
c
не имеет права ребенка. Это родительский элементb
, который прошел. Следующий родительd
, который не был пройден, поэтому остановитесь здесь. -
d
имеет правое поддерево. Его самый левый элементe
. - ...
-
g
не имеет правильного поддерева, поэтому подходите вверх.f
посетили, так как мы пришли из права.d
.d
не имеет родителя, поэтому мы не можем двигаться дальше. Мы пришли с самой правой node, и мы закончили итерацию.