diff --git a/src/main/java/net/abhinavsarkar/algorist/AVLTree.java b/src/main/java/net/abhinavsarkar/algorist/AVLTree.java index 2021eb1..91e2077 100644 --- a/src/main/java/net/abhinavsarkar/algorist/AVLTree.java +++ b/src/main/java/net/abhinavsarkar/algorist/AVLTree.java @@ -1,16 +1,10 @@ package net.abhinavsarkar.algorist; -import guru.nidi.graphviz.engine.Format; -import guru.nidi.graphviz.engine.Graphviz; -import guru.nidi.graphviz.model.MutableGraph; -import guru.nidi.graphviz.model.MutableNode; -import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.Optional; import java.util.Stack; -import static guru.nidi.graphviz.model.Factory.*; public class AVLTree,V> implements Iterable> { @@ -54,9 +48,9 @@ public class AVLTree,V> implements Iterable,V> implements Iterable predecessor(K key); boolean isEmpty(); StringBuilder toStringBuilder(int level); - Optional addToGraph(MutableGraph graph); boolean checkIfBST(); boolean checkIfAVLT(); + Optional> accept(Visitor visitor); default ValueNode toValueNode() { if (this.isEmpty()) { @@ -349,17 +343,16 @@ public class AVLTree,V> implements Iterable addToGraph(MutableGraph graph) + public Optional> accept(Visitor visitor) { - String name = getGraphNodeName(); - MutableNode node = mutNode(name); - graph.add(node); - left.addToGraph(graph).ifPresent(n -> graph.add(node.addLink(mutNode(n)))); - right.addToGraph(graph).ifPresent(n -> graph.add(node.addLink(mutNode(n)))); - return Optional.of(name); + String name = this.getName(); + visitor.visitNode(name); + this.left.accept(visitor).ifPresent(n -> visitor.visitLink(name, n.getName())); + this.right.accept(visitor).ifPresent(n -> visitor.visitLink(name, n.getName())); + return Optional.of(this); } - private String getGraphNodeName() + private String getName() { return this.height + ":" + this.key; } @@ -459,7 +452,7 @@ public class AVLTree,V> implements Iterable addToGraph(MutableGraph graph) { + public Optional> accept(Visitor visitor) { return Optional.empty(); } } @@ -544,6 +537,12 @@ public class AVLTree,V> implements Iterable bst = new AVLTree<>(true); diff --git a/src/main/java/net/abhinavsarkar/algorist/AVLTreeGraphvizVisitor.java b/src/main/java/net/abhinavsarkar/algorist/AVLTreeGraphvizVisitor.java new file mode 100644 index 0000000..8ba2cbc --- /dev/null +++ b/src/main/java/net/abhinavsarkar/algorist/AVLTreeGraphvizVisitor.java @@ -0,0 +1,41 @@ +package net.abhinavsarkar.algorist; + +import guru.nidi.graphviz.engine.Format; +import guru.nidi.graphviz.engine.Graphviz; +import static guru.nidi.graphviz.model.Factory.mutGraph; +import static guru.nidi.graphviz.model.Factory.mutNode; +import guru.nidi.graphviz.model.MutableGraph; +import guru.nidi.graphviz.model.MutableNode; +import java.io.File; +import java.io.IOException; + +public class AVLTreeGraphvizVisitor implements AVLTree.Visitor +{ + private final MutableGraph graph; + private final AVLTree index = new AVLTree<>(true); + + public AVLTreeGraphvizVisitor(String graphName) + { + this.graph = mutGraph(graphName).setDirected(true); + } + + @Override + public void visitNode(String nodeName) + { + MutableNode gNode = mutNode(nodeName); + graph.add(gNode); + index.insert(nodeName, gNode); + } + + @Override + public void visitLink(String parentNodeName, String childNodeName) + { + index.get(parentNodeName) + .ifPresent(gNode -> graph.add(gNode.addLink(mutNode(childNodeName)))); + } + + public void renderToPNG(String fileName) throws IOException + { + Graphviz.fromGraph(graph).height(1000).render(Format.PNG).toFile(new File(fileName)); + } +}