如何遍历树结构以绘制图形?

时间:2016-12-10 20:09:16

标签: java traversal graphic tree-structure

我正在使用JGraphT库为我的树结构绘制图形,但是库根据一组给定的节点和连接的边缘绘制图形。我已经阅读了Class" DirectedAcyclicGraph.VisitedArrayListImpl&# 34;在图书馆javadoc,但我不太明白它,我不确定它是否是我正在寻找的。

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<String, DefaultEdge> 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<String, DefaultEdge> g =
        new ListenableDirectedMultigraph<>(DefaultEdge.class);

    // create a visualization using JGraph, via an adapter
    jgAdapter = new JGraphModelAdapter<>(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<V, E>
    extends DefaultListenableGraph<V, E>
    implements DirectedGraph<V, E>
{
    private static final long serialVersionUID = 1L;

    ListenableDirectedMultigraph(Class<E> edgeClass)
    {
        super(new DirectedMultigraph<>(edgeClass));
    }
}}

我正在使用javadoc中的这个演示代码,我想找到一种方法将它连接到这个树结构。有人做过类似的事吗?

这是我的树形结构

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<Tree> stack = new Stack<Tree>();  
     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);


         }  

     }  

 }  

我将不胜感激任何帮助

1 个答案:

答案 0 :(得分:0)

JGraphT库正在使用自己的图类绘制,因此您需要:

  • 放弃自己的树实现并使用库的类
  • 使用您自己的实现在库中扩展适当的树类
  • 根据需要使用您自己的树,但是当您需要使用jgraph绘制时,将树的节点和边缘复制到框架的图形实现之一