# HG changeset patch # User one # Date 1283103890 -32400 # Node ID a281fb7eaf3935bebae9a2e8c1275951633fdd66 # Parent 423a01ec2d325f883f7d5387a4c383579ead080b add diff -r 423a01ec2d32 -r a281fb7eaf39 src/treecms/proto/test/PreOrderTreeWalkerRecursive1.java --- a/src/treecms/proto/test/PreOrderTreeWalkerRecursive1.java Mon Aug 30 00:48:50 2010 +0900 +++ b/src/treecms/proto/test/PreOrderTreeWalkerRecursive1.java Mon Aug 30 02:44:50 2010 +0900 @@ -1,5 +1,88 @@ 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 +{ + private NodeAPI m_root; + + public PreOrderTreeWalkerRecursive1(NodeAPI _root) + { + m_root = _root; + } + + @Override + public Iterator iterator() + { + return new PreOrderRecursiveIterator(m_root); + } -public class PreOrderTreeWalkerRecursive1 { + class PreOrderRecursiveIterator implements Iterator + { + private LinkedList nextList; + + public PreOrderRecursiveIterator(NodeAPI _root) + { + nextList = new LinkedList(); + getChildren(_root, nextList); + } + + void getChildren(NodeAPI node, LinkedListlist) { + 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 findPath(NodeAPI root, NodeAPI node) { + LinkedList list = new LinkedList(); + list.addFirst(root); + findPath(root,node,list); + return list; + } + + private boolean findPath(NodeAPI root, NodeAPI node, LinkedList 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 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; + } }