title: How to traverse a tree structure in order to draw a graph?
body: <p>I'm working with JGraphT library to draw a graph for my tree structure but the library draws a graph based on a given set of nodes and connected edges.I have read the Class "DirectedAcyclicGraph.VisitedArrayListImpl" in the library javadoc but I did not quite understand it and I'm not sure if it is what I'm looking for.</p>
  
  <pre><code>public class JGraphAdapterDemo
  extends JApplet{
  
  private static final long serialVersionUID = 3256444702936019250L;
  private static final Color DEFAULT_BG_COLOR = Color.decode("#FAFBFF");
  private static final Dimension DEFAULT_SIZE = new Dimension(530, 320);
  
  
  private JGraphModelAdapter&lt;String, DefaultEdge&gt; jgAdapter;
  
  /**
   * An alternative starting point for this demo, to also allow running this applet as an
   * application.
   *
   * @param args ignored.
   */
  public static void main(String[] args)
  {
      JGraphAdapterDemo applet = new JGraphAdapterDemo();
      applet.init();
  
      JFrame frame = new JFrame();
      frame.getContentPane().add(applet);
      frame.setTitle("JGraphT Adapter to JGraph Demo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setVisible(true);
  }
  
  
    {@inheritDoc}
  
  public void init()
  {
  
      ListenableGraph&lt;String, DefaultEdge&gt; g =
          new ListenableDirectedMultigraph&lt;&gt;(DefaultEdge.class);
  
      // create a visualization using JGraph, via an adapter
      jgAdapter = new JGraphModelAdapter&lt;&gt;(g);
  
      JGraph jgraph = new JGraph(jgAdapter);
  
      adjustDisplaySettings(jgraph);
      getContentPane().add(jgraph);
      resize(DEFAULT_SIZE);
  
      String v1 = "+";
      String v2 = "3";
      String v3 = "*";
      String v4 = "4";
      String v5 = "5";
  
      // add some sample data (graph manipulated via JGraphT)
      g.addVertex(v1);
      g.addVertex(v2);
      g.addVertex(v3);
      g.addVertex(v4);
      g.addVertex(v5);
  
      g.addEdge(v1, v2);
      g.addEdge(v1, v3);
      g.addEdge(v3, v4);
      g.addEdge(v3, v5);
  
      positionVertexAt(v1, 130, 40);
      positionVertexAt(v2, 50, 150);
      positionVertexAt(v3, 280, 150);
      positionVertexAt(v4, 240, 250);
      positionVertexAt(v5, 400, 250);  
  
  }
  
  private void adjustDisplaySettings(JGraph jg)
  {
      jg.setPreferredSize(DEFAULT_SIZE);
  
      Color c = DEFAULT_BG_COLOR;
      String colorStr = null;
  
      try {
          colorStr = getParameter("bgcolor");
      } catch (Exception e) {
      }
  
      if (colorStr != null) {
          c = Color.decode(colorStr);
      }
  
      jg.setBackground(c);
  }
  
  @SuppressWarnings("unchecked") 
  private void positionVertexAt(Object vertex, int x, int y)
  {
      DefaultGraphCell cell = jgAdapter.getVertexCell(vertex);
      AttributeMap attr = cell.getAttributes();
      Rectangle2D bounds = GraphConstants.getBounds(attr);
  
      Rectangle2D newBounds = new Rectangle2D.Double(x, y, bounds.getWidth(), bounds.getHeight());
  
      GraphConstants.setBounds(attr, newBounds);
  
  
      AttributeMap cellAttr = new AttributeMap();
      cellAttr.put(cell, attr);
      jgAdapter.edit(cellAttr, null, null, null);
  }
  
  private static class ListenableDirectedMultigraph&lt;V, E&gt;
      extends DefaultListenableGraph&lt;V, E&gt;
      implements DirectedGraph&lt;V, E&gt;
  {
      private static final long serialVersionUID = 1L;
  
      ListenableDirectedMultigraph(Class&lt;E&gt; edgeClass)
      {
          super(new DirectedMultigraph&lt;&gt;(edgeClass));
      }
  }}
  </code></pre>
  
  <p>I'm using this demo code from the javadoc and I want to find a way to connect it to this tree structure. Have anyone done something similar to this?</p>
  
  <p>This is my tree structure</p>
  
  <pre><code>public class Tree {
      Tree left, right;
  char op;
  int val;
  boolean isOp;
  
  Tree(char op, Tree l, Tree r) {
  this.isOp = true;
  this.left = l;
  this.right = r;
  this.op = op;
  }
  
  Tree (int v){
  this.isOp = false;
  this.val = v;
  }
  
  static void toString(Tree t) {
  if (t.isOp){
      toString(t.left);
      System.out.print(t.op);
      toString(t.right);
  }
  else
      System.out.print(t.val);
  }
  
  
  public void preorderIter(Tree root) {  
  
       if(root == null)  
           return;  
  
       Stack&lt;Tree&gt; stack = new Stack&lt;Tree&gt;();  
       stack.push(root);  
  
       while(!stack.empty()){  
  
           Tree n = stack.pop();  
           System.out.printf("%s ",n.op);  
  
  
           if(n.right != null){  
               stack.push(n.right);
               System.out.printf("%s",n.right);
           }  
           if(n.left != null){  
               stack.push(n.left);
               System.out.printf("%s",n.left);
  
  
           }  
  
       }  
  
   }  
  </code></pre>
  
  <p>I would appreciate any help</p>