view src/treecms/proto/test/PreOrderTreeWalker.java @ 18:423a01ec2d32

findPath and cloneTree in PreorderTreewalker1 (not yet tested)
author one
date Mon, 30 Aug 2010 00:48:50 +0900
parents 18f696e9fc1e
children
line wrap: on
line source

package treecms.proto.test;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import treecms.proto.api.NodeAPI;

public class PreOrderTreeWalker implements Iterable<NodeAPI>
{
	private NodeAPI m_root;
	
	public PreOrderTreeWalker(NodeAPI _root)
	{
		m_root = _root;
	}
	
	class NodeState {
		NodeAPI node;
		int position;
		NodeState(NodeAPI n,int p) { node = n; position = p; }
	}
	class IteratorState implements Iterator<NodeAPI> {
		LinkedList<NodeState>nodeStack;
		int position;
		NodeAPI current, next;
		
		IteratorState(NodeAPI root) {
			current = root;
			position = 0;
			nodeStack = new LinkedList<NodeState>();
		}
		public boolean hasNext() {
			while (position>=current.getChildList().size()) {
				if (nodeStack.isEmpty()) return false;
				NodeState s =  nodeStack.poll();
				current = s.node;
				position = s.position;
			}
			next = current.getChildList().get(position++);
			if (! next.getChildList().isEmpty()) {
				nodeStack.addLast(new NodeState(current,position));
				current = next;
				position = 0;
			}
			return true;
		}
		public NodeAPI next() {
			return next;
		}
		public void remove() {
		}
	}
	
	@Override
	public Iterator<NodeAPI> iterator() {
			return new IteratorState(m_root);
	}
}