import java.util.ArrayList; import java.util.List; import java.util.Stack; public class Vertex { public Stack left; public Stack middle; public Stack right; public Vertex previous; public Vertex(Stack left, Stack middle, Stack right) { this.left = left; this.middle = middle; this.right = right; previous = null; } public List getChildren() { List children = new ArrayList<>(); leftToMiddle(children); leftToRight(children); middleToLeft(children); middleToRight(children); rightToLeft(children); rightToMiddle(children); return children; } public String toString() { StringBuilder sb = new StringBuilder("{"); sb.append(left.toString()); sb.append(", "); sb.append(middle.toString()); sb.append(", "); sb.append(right.toString()); sb.append("}"); return sb.toString(); } private void leftToMiddle(List children) { if (!left.isEmpty() && (middle.isEmpty() || left.peek() < middle.peek())) { @SuppressWarnings("unchecked") Vertex child = new Vertex((Stack) left.clone(), (Stack) middle.clone(), (Stack) right.clone()); child.middle.push(child.left.pop()); child.previous = this; children.add(child); } } private void leftToRight(List children) { if (!left.isEmpty() && (right.isEmpty() || left.peek() < right.peek())) { @SuppressWarnings("unchecked") Vertex child = new Vertex((Stack) left.clone(), (Stack) middle.clone(), (Stack) right.clone()); child.right.push(child.left.pop()); child.previous = this; children.add(child); } } private void middleToLeft(List children) { if (!middle.isEmpty() && (left.isEmpty() || middle.peek() < left.peek())) { @SuppressWarnings("unchecked") Vertex child = new Vertex((Stack) left.clone(), (Stack) middle.clone(), (Stack) right.clone()); child.left.push(child.middle.pop()); child.previous = this; children.add(child); } } private void middleToRight(List children) { if (!middle.isEmpty() && (right.isEmpty() || middle.peek() < right.peek())) { @SuppressWarnings("unchecked") Vertex child = new Vertex((Stack) left.clone(), (Stack) middle.clone(), (Stack) right.clone()); child.right.push(child.middle.pop()); child.previous = this; children.add(child); } } private void rightToLeft(List children) { if (!right.isEmpty() && (left.isEmpty() || right.peek() < left.peek())) { @SuppressWarnings("unchecked") Vertex child = new Vertex((Stack) left.clone(), (Stack) middle.clone(), (Stack) right.clone()); child.left.push(child.right.pop()); child.previous = this; children.add(child); } } private void rightToMiddle(List children) { if (!right.isEmpty() && (middle.isEmpty() || right.peek() < middle.peek())) { @SuppressWarnings("unchecked") Vertex child = new Vertex((Stack) left.clone(), (Stack) middle.clone(), (Stack) right.clone()); child.middle.push(child.right.pop()); child.previous = this; children.add(child); } } public int hashCode() { return toString().hashCode(); } public boolean equals(Object other) { if (other instanceof Vertex) { return toString().equals(((Vertex) other).toString()); } return false; } }