我如何编写一个Java迭代器(即需要nextand hasNext方法),它以二叉树的根为基础并 以有序的 方式遍历二叉树的节点?
next
hasNext
子树的第一个元素始终是最左边的一个。元素之后的下一个元素是其右子树的第一个元素。如果元素没有正确的子元素,则下一个元素是元素的第一个正确的祖先。如果元素既没有正确的子元素也没有正确的祖先,则它是最右边的元素,并且它是迭代中的最后一个元素。
我希望我的代码是人类可读的并且涵盖所有情况。
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
c
d
e
g
f