ツリーループ(再帰/非再帰)
二叉木および二叉木に対する三種類の遍歴(先根,中根,後根)の再帰遍歴アルゴリズム実装,および先根遍歴の非再帰実装.
//Node
//アクセス操作インタフェースの遍歴
//実現
//tester
//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());
}
}