将二进制搜索树转换为XML

时间:2018-07-07 13:06:11

标签: java xml processing binary-search-tree data-visualization

我正在尝试将二进制搜索树转换为XML,以便使用处理编程语言进行绘制。我面临的问题是关闭标签位置不正确。 这是生成XML的Java代码

public void toXML() {
    Stack<String> tags = new Stack<>();
    PrintWriter pw = null;
    try {
        pw = new PrintWriter("tree.xml");
    } catch (IOException e) {
        e.printStackTrace();
    }
    pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
    toXMLHelper(this.root, pw, tags, "root");
    while(!tags.isEmpty())
        pw.println(tags.pop().toString());
    pw.flush();
    pw.close();
}

private void toXMLHelper(BSTNode<T> p, PrintWriter pw, Stack<String> tags, String place) {
    if (p != null) {
        addTag(p, pw, tags, place);

        if(p.left == null && p.right == null)
            pw.println(tags.pop().toString());

        toXMLHelper(p.left, pw, tags, "left");

        toXMLHelper(p.right, pw, tags, "Right");

    }
}

private void addTag(BSTNode<T> p, PrintWriter pw, Stack<String> tags, String place) {
    pw.println("<node place=\"" + place + "\">" + p.el.toString() );
    tags.push("</node>");
}

这是生成的XML

<?xml version="1.0" encoding="UTF-8"?>
<node place="root">8
    <node place="left">4
        <node place="left">2
        </node>
        <node place="Right">7
        </node>
        <node place="Right">9
        </node>
    </node>
</node>

This is the tree

最下面的结束标记之一应放在节点7的结束标记之下。我该如何解决这个问题呢? 我尝试使用XML编码器,但它会生成过多不必要的标签。

1 个答案:

答案 0 :(得分:1)

我相信您正在尝试以错误的方式进行检查。 一种更简单的方法是遍历每个元素,而不是将其标签保存在堆栈中。

去那里:

public PrintWriter bstToXML() {
    try (PrintWriter pw = new PrintWriter("tree.xml")) {
        pw.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
        bstToXMLHelper(this.root, pw, "root");
        return pw;
    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

private void bstToXMLHelper(BSTNode node, PrintWriter pw, String place) {
    if(node == null) {
        return;
    }

    pw.println("<node place=\"" + place + "\">" + node.el.toString());

    if(node.left != null){
        bstToXMLHelper(node.left, pw, "left");
    }

    if(node.right != null) {
        bstToXMLHelper(node.right, pw, "right");
    }

    pw.println("</node>");
}

希望有帮助。