【问题标题】:BST graphical representation needed in java [closed]java中需要的BST图形表示[关闭]
【发布时间】:2014-04-01 00:32:15
【问题描述】:

我正在使用Model–view–controller 设计模式,我需要一个用于 BST/AVL 模型的 UI 查看器,我已经开发了模型和控制器逻辑,我只需要查看器,我不需要现在要处理图形,如果有人有一个 Viewer 类,该类的方法可以获取树的根并绘制它,而不需要高级动画或效果,那将会很有用

类似

SimpleBSTreeViewer.draw(myTree.getRoot());

树的节点结构

public class NodeBST <T extends Comparable<T>> {
 private T data;
 private NodeBST<T> left;
 private NodeBST<T> right;
 private NodeBST<T> parent;
 
 //other methods go here ...
}

这将有助于专注于编码逻辑部分,

我已经搜索并找到了其他代表树的 Java 小程序,但它们在同一类中具有模型逻辑和视图,我正在使用模型视图控制器模式(MVC 模式),最好将模型与视图分开尽可能多地,我只想要我的模型的查看器

-注意:这是我需要的示例(我已经使用了 JTree,但并不令人满意。)

【问题讨论】:

标签: java swing javafx binary-search-tree avl-tree


【解决方案1】:
  • 获取Jgraphx库并从HelloWorld开始 我编写这个类的例子

  • 使用this问题计算节点坐标。

    package algorithms.searching.bst;
    
    import java.util.Random;
    
    import javax.swing.JFrame;
    
    import log.Logger;
    
    import algorithms.searching.bst.avl.AVL;
    
    import com.mxgraph.swing.mxGraphComponent;
    import com.mxgraph.view.mxGraph;
    
    @SuppressWarnings("serial")
    
    public class TreeViewer<T extends Comparable<T>> extends JFrame {
    
    static private int CANVAS_HEIGHT = 600;
    static private int CANVAS_WIDTH = 1000;
    
    private int rootY = 10;
    private int NODE_SIZE = 25;
    private int ROW_HEIGHT = 50;
    mxGraph graph = new mxGraph();
    Object parent = graph.getDefaultParent();
    
    /**
     * draws a tree starting from this root
     * 
     * @param root
     * @param depth
     *            number of nodes to the root (including root)
     * @param index
     *            index of node in this level (leftChildIndex = parentIndex * 2
     *            - 1) and (rightChildIndex = parentIndex * 2)
     * @return
     */
    public Object drawTree(NodeBST<T> root, int depth, int index) {
        if (root == null) {
            return null;
        }
    
        // draw root
    
        /*
         * leftChildIndex = parentIndex * 2 - 1 
         * rightChildIndex = parentIndex *2
         *
         *
         * x = index * canvasWidth / (2^depth + 1)
         *
         * y = depth * canvasHeight / treeDepth
         */
    
        int myX = (int) ((CANVAS_WIDTH * (index)) / (Math.pow(2, depth - 1) + 1));
    
        Object rootVertex = graph.insertVertex(parent, null, root.getData(),
                myX, depth * ROW_HEIGHT + rootY, NODE_SIZE, NODE_SIZE);
    
        Logger.log("new x coordinate=" + myX);
    
        // recurse for right child
    
        Object rightChildVertex = drawTree(root.getRight(), depth + 1,
                index * 2);
    
        if (rightChildVertex != null) {// edge
            graph.insertEdge(parent, null, "R", rootVertex, rightChildVertex,
                    "startArrow=none;endArrow=none;strokeWidth=1;strokeColor=green");
        }
    
        Object leftChildVertex = drawTree(root.getLeft(), depth + 1,
                index * 2 - 1);
    
        // recurse for right child
    
        if (leftChildVertex != null) { // edge
            graph.insertEdge(parent, null, "L", rootVertex, leftChildVertex,
                    "startArrow=none;endArrow=none;strokeWidth=1;strokeColor=green");
        }
    
        return rootVertex;
    
    }
    
    /**
     * Redraw the whole tree
     * 
     * @param root
     *            the root of tree to be drawn
     */
    
    public void update(NodeBST<T> root) {
    
        graph.getModel().beginUpdate();
    
        try {
    
            Object[] cells = graph.getChildCells(parent, true, false);
            graph.removeCells(cells, true);
            drawTree(root, 1, 1);
    
        } finally {
            graph.getModel().endUpdate();
        }
    }
    
    public TreeViewer(NodeBST<T> root) {
        // super("Hello, World!");
    
        this.update(root);
    
        mxGraphComponent graphComponent = new mxGraphComponent(graph);
    
        getContentPane().add(graphComponent);
    }
    
    public static void main(String[] args) {
    
        AVL<Integer> bst = new AVL<Integer>();//use AVL tree class 
    
        Random randomGenerator = new Random();
        for (int i = 0; i < 20; i++) {//try generating 20 random integers
            bst.insert(randomGenerator.nextInt(1000));
        }
    
        TreeViewer<Integer> myTreeViewer=new TreeViewer<Integer>(bst.getRoot());
        JFrame frame = myTreeViewer;
    
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(CANVAS_WIDTH, CANVAS_HEIGHT);
        frame.setVisible(true);
    
    }
    
    
    
    }
    
  • 只需修改这个类来获取你的树类

  • 非常感谢NeplatnyUdaj

【讨论】:

  • 我的存储库中 TreeViewer 的更新版本 here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多