Java 将字符串转换为二叉树

Java 将字符串转换为二叉树,java,algorithm,graph,graph-algorithm,jung2,Java,Algorithm,Graph,Graph Algorithm,Jung2,我面临着可视化此字符串的问题: “=IF(A2=1;0;IF(D2=D3;IF(C2=1;真;假);4))” 正如您所见,通用语法类似于excel公式,因此我有IF(TEST;TRUE;FALSE) 我的问题是,我想用库以二进制搜索树格式可视化这个字符串。下面,您可以看到树的外观示例: 下面是一些代码,用于可视化当前的顶点 public class SimpleGraphView { Graph<Integer, String> g; Graph<String

我面临着可视化此字符串的问题:

“=IF(A2=1;0;IF(D2=D3;IF(C2=1;真;假);4))”

正如您所见,通用语法类似于excel公式,因此我有
IF(TEST;TRUE;FALSE)

我的问题是,我想用库以二进制搜索树格式可视化这个字符串。下面,您可以看到树的外观示例:

下面是一些代码,用于可视化当前的顶点

public class SimpleGraphView {
    Graph<Integer, String> g;
    Graph<String, String> n;

    /** Creates a new instance of SimpleGraphView */

    String text = "=IF(A2=1;0;IF(D2=D3;IF(C2=1;TRUE;FALSE);4))";


    public SimpleGraphView() {

        n = new SparseMultigraph<String, String>();

        String str = text;
        String delim = ";";
        StringTokenizer tok = new StringTokenizer(str, delim, true);

        text = text.replace("(", " ");
        String s = text.replace(")", " ");
        String[] r = s.split(";");

        for (int i = 0; i < r.length; i++) {

            //Vertex
            if(r.equals("=IF(")) {
                n.addVertex(r[i].toString());
            }

            if(i % 2==0){
                n.addVertex(r[i].toString());
            } else {
                n.addVertex(r[i].toString());
            }

        }

    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SimpleGraphView sgv = new SimpleGraphView(); // Creates the graph...
        // Layout<V, E>, VisualizationViewer<V,E>
        Layout<Integer, String> layout = new CircleLayout(sgv.n);
        layout.setSize(new Dimension(300,300));

        VisualizationViewer<Integer,String> vv = new VisualizationViewer<Integer,String>(layout);
        vv.setPreferredSize(new Dimension(350,350));
        // Show vertex and edge labels
        vv.getRenderContext().setVertexLabelTransformer(new ToStringLabeller());
        vv.getRenderContext().setEdgeLabelTransformer(new ToStringLabeller());

        // Create our "custom" mouse here. We start with a PluggableGraphMouse
        // Then add the plugins you desire.
        PluggableGraphMouse gm = new PluggableGraphMouse(); 
        gm.add(new TranslatingGraphMousePlugin(MouseEvent.BUTTON1_MASK));
        gm.add(new ScalingGraphMousePlugin(new CrossoverScalingControl(), 0, 1.1f, 0.9f));

        vv.setGraphMouse(gm); 
        JFrame frame = new JFrame("Interactive Graph View 3");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(vv);
        frame.pack();
        frame.setVisible(true);       


    }
}
public类SimpleGraphView{
图g;
图n;
/**创建SimpleGraphView的新实例*/
字符串文本=“=IF(A2=1;0;IF(D2=D3;IF(C2=1;真;假);4))”;
公共SimpleGraphView(){
n=新的SparseMultraph();
字符串str=文本;
字符串delim=“;”;
StringTokenizer tok=新的StringTokenizer(str、delim、true);
text=text.replace(“(”,”);
字符串s=text.replace(“)”,“”);
字符串[]r=s.split(“;”);
对于(int i=0;i
我可以渲染数组
r
中字符串之外的所有顶点。我的问题是我不知道如何将所有这些顶点连接到正确的边。有什么建议吗,如何将所有顶点连接到正确的边


我非常感谢您的回答!

当您在字符串中循环时,您需要跟踪哪个节点是父节点,哪个节点是子节点。当您输入“IF=”条件时,这是父节点。在遇到下一个“IF=”条件之前,其他节点都是它的子节点(该节点也是前一个父节点的子节点,但却是所有后续节点的父节点)因此,将子对象和父对象添加到
对中,并将其添加到带有
EdgeType.DIRECTED的
SimpleMultiGraph
。文档对定向边如何与
对进行交互不太清楚,但我假设添加到
对中的第一个
顶点是传出的,第二个是传入的。J因为文档不清楚,所以只能猜测。

最简单的方法是以我认为不同的方式拆分文本。请注意,我用
addEdge
addVertex
替换了图形的方法:

String[] operands = text.substring(1, text.length()).split("[;()]+");
int numIfs = operands.length / 3; // actually (operands.length - 1) / 3 but int division makes it the same 
String[] nodes = new String[numIfs]; // stores the nodes (test strings)
int[] operandNos = new int[numIfs]; // stores the number of operands the if currently has
int nodesIndex = -1; // the index of the if node currently parsed
for (String s : operands) {
    if (s.equals("IF")) {
        // new if found -> increase position in the "stack" (nodes)
        operandNos[++nodesIndex] = 0;
    } else {
        addVertex(s);
        switch (operandNos[nodesIndex]++) {
            case 0:
                // first operand = node name
                nodes[nodesIndex] = s;
                break;
            case 1:
                // second operand found -> add edge
                addEdge(s, nodes[nodesIndex]);
                break;
            case 2:
                // last operand found -> add edge and go back
                do {
                    addEdge(s, nodes[nodesIndex]);
                    s = nodes[nodesIndex--];
                } while (nodesIndex >= 0 && operandNos[nodesIndex]++ == 2);
                if (nodesIndex >= 0) {
                    // was not the last operand of the IF
                    addEdge(s, nodes[nodesIndex]);
                }
        }
    }
}
使用图形的方法代替
addEdge
addVertex
。我建议使用,因为您的图形是定向的,不允许平行边。要向图形添加顶点,请使用
graph.addVertex(vertexName)
,要添加边,请使用
graph.addEdge(edge,sourceVertexName,destinationVertexName)

addEdge
addVertex
的实现如下所示:

void addVertex(String s) {
    n.addVertex(s);
}

void addEdge(String source, String dest) {
    n.addEdge("", source, dest);
}

或者最好将它们内联。

从图中,所有边都是定向的。没有无向边。鉴于此,我不确定我是否理解这个问题。
SimpleMultiGraph
包含一个
addEdge()
函数。您对它的哪一部分有问题?谢谢您的回答!我的问题是将右边与右顶点连接起来,这样我就可以得到如图所示的图形。听起来你在拆分字符串的逻辑上有困难。你必须在我打赌的某个地方使用正则表达式。既然这样,我想我应该先拆分
IF
,而不是
,因为这样你就知道你有多少个条件,一个d它将条件和至少一个结果保存在子字符串中。谢谢你的回答!我想我稍微理解你如何处理这个问题,但对我来说很难实现。如果你能在这个问题上帮助我,我将不胜感激!谢谢你的回答!你所说的
配对是什么意思ple!谢谢你的回答!但是,目前我无法运行它,因为eclipse说
addVertex(s)
etc.是
方法addVertex(String)对于SimpleGraphView类型未定义。如果您能给出答案,以及如何运行它,我将不胜感激。@Kare:我想您可以自己找出这一部分。有时,查看一下或会有所帮助。但我编辑了我的答案。