From a1ea0f3bf3287d8ca5fe108061ae7be5a9a98401 Mon Sep 17 00:00:00 2001 From: Abhinav Sarkar Date: Fri, 5 Jul 2019 12:37:55 +0530 Subject: [PATCH] Changes AVL tree rendering to use visitor pattern --- .../net/abhinavsarkar/algorist/AVLTree.java | 37 ++++++++--------- .../algorist/AVLTreeGraphvizVisitor.java | 41 +++++++++++++++++++ 2 files changed, 59 insertions(+), 19 deletions(-) create mode 100644 src/main/java/net/abhinavsarkar/algorist/AVLTreeGraphvizVisitor.java 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)); + } +}