将二进制搜索树转换为XML

问题描述 投票:1回答:1

我正在尝试将二进制搜索树转换为XML以使用Processing编程语言绘制它。我面临的问题是关闭标签位置不正确。这是生成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编码器,但它生成了太多不必要的标记。

java xml processing binary-search-tree data-visualization
1个回答
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>");
}

希望能帮助到你。

© www.soinside.com 2019 - 2024. All rights reserved.