Mercurial > hg > Members > shoshi > TreeCMSv1
view src/treecms/proto/test/PreOrderTreeWalkerRecursive1.java @ 19:a281fb7eaf39
add
author | one |
---|---|
date | Mon, 30 Aug 2010 02:44:50 +0900 |
parents | cc89a4664927 |
children |
line wrap: on
line source
package treecms.proto.test; import java.util.Iterator; import java.util.LinkedList; import treecms.proto.api.NodeAPI; import treecms.proto.simple.SimpleNodeAPI; public class PreOrderTreeWalkerRecursive1 implements Iterable<NodeAPI> { private NodeAPI m_root; public PreOrderTreeWalkerRecursive1(NodeAPI _root) { m_root = _root; } @Override public Iterator<NodeAPI> iterator() { return new PreOrderRecursiveIterator(m_root); } class PreOrderRecursiveIterator implements Iterator<NodeAPI> { private LinkedList<NodeAPI> nextList; public PreOrderRecursiveIterator(NodeAPI _root) { nextList = new LinkedList<NodeAPI>(); getChildren(_root, nextList); } void getChildren(NodeAPI node, LinkedList<NodeAPI>list) { list.add(node); for(NodeAPI child : node.getChildList()){ getChildren(child,list); } } @Override public boolean hasNext() { return !nextList.isEmpty(); } @Override public NodeAPI next() { return nextList.poll(); } @Override public void remove() { throw new UnsupportedOperationException("cant remove from itrerator"); } } public LinkedList<NodeAPI> findPath(NodeAPI root, NodeAPI node) { LinkedList<NodeAPI> list = new LinkedList<NodeAPI>(); list.addFirst(root); findPath(root,node,list); return list; } private boolean findPath(NodeAPI root, NodeAPI node, LinkedList<NodeAPI> list) { if (root==node) return true; for(NodeAPI child : node.getChildList()){ if (findPath(child,node,list)) { list.addFirst(child); return true; } } return false; // backtrack } public NodeAPI cloneTree(LinkedList<NodeAPI> path) { NodeAPI old = path.poll(); NodeAPI node = new SimpleNodeAPI(old.getTitle()); node.setClassName(old.getClassName()); for(NodeAPI child: old.getChildList()) { if (child==old && !path.isEmpty()) child = cloneTree(path); node.getChildList().add(child); } return node; } }