ツリーループ(再帰/非再帰)


二叉木および二叉木に対する三種類の遍歴(先根,中根,後根)の再帰遍歴アルゴリズム実装,および先根遍歴の非再帰実装.
//Node

public class Node {

	private Node left;
	private Node right;
	private Object value;

	public Node(Node left, Node right, Object value) {
		super();
		this.left = left;
		this.right = right;
		this.value = value;
	}
	
	public Node left() {
		return left;
	}
	public Node right() {
		return right;
	}
	public Object value() {
		return value;
	}
	
}

//アクセス操作インタフェースの遍歴
public interface Visitor {

	public void visit(Node obj);
	
}

//実現
public class BinaryTreeScan {

	public void firstRootScan(Node node, Visitor visitor) {

		if (node == null)
			return;
		
		visitor.visit(node);
		this.firstRootScan(node.left(), visitor);
		this.firstRootScan(node.right(), visitor);
	}
	
	public void midRootScan(Node node, Visitor visitor) {
		
		if (node == null)
			return ;
		
		this.midRootScan(node.left(), visitor);
		visitor.visit(node);
		this.midRootScan(node.right(), visitor);
	}
	
	public void lastRootScan(Node node, Visitor visitor) {
		
		if (node == null)
			return ;
		
		this.lastRootScan(node.left(), visitor);
		this.lastRootScan(node.right(), visitor);
		visitor.visit(node);
	}
	
	public void firstRootScanNonRecursion(Node node, Visitor visitor) {
		
		if (node == null)
			return ;

		Stack stack = new Stack();
		stack.push(node);
		
		while(!stack.empty()) {
			Node n = (Node) stack.pop();
			visitor.visit(n);
			if (n.right() != null)
				stack.push(n.right());
			if (n.left() != null)
				stack.push(n.left());
		}
		
	}
	
}

//tester
public class Main {

	public static void main(String[] args) {
		Node b = new Node(new Node(null,null,"d"),new Node(null,null,"e"),"b");
		Node a =  new Node(b, new Node(new Node(null,null,"f"),null,"c"),"a");
		
		BinaryTreeScan binaryTreeScan = new BinaryTreeScan();
		StringBuilder sb = new StringBuilder();
		
		binaryTreeScan.firstRootScanNonRecursion(a,new VisitorStringBuffer(sb));
		
		System.out.println(sb.toString());
	}

}

 class VisitorStringBuffer implements Visitor {
	private final StringBuilder sb;

	VisitorStringBuffer(StringBuilder sb) {
		this.sb = sb;
	}

	public void visit(Node obj) {
		sb.append(obj.value());
	}
}