制作给定树的一系列后序数据

时间:2017-05-11 10:02:50

标签: java database algorithm tree

作为我的任务的一部分,我获得了一个表达式树,我需要将其转换为具有O(n)运行时的in-fix。 例如,

given tree

将此树转换为“((1 V(2 H(3 V 4)))H(5 V 6))”。 我想不出一种方法可以将它直接转换为中缀,所以我想首先将其转换为后期修复而不是修复。 (如果有更好的方法请告诉我)。

现在,我的问题是将树转换为后期订单。 我尝试过以下方法:

    private String treeToPost(Node node, String post) {
    if (node != null) {
        treeToPost(node.left, post);
        treeToPost(node.right, post);
        post = post + node.data.getName();
    }
    return post;
}

现在我对这个方法有两个问题,第一个是不起作用,因为它只保存了它所经过的最后一个节点,第二个是我不确定它是否会在O(n)运行,因为它必须每次都创建一个新的字符串。 我在这里找到了这个问题的解决方案,但它使用了我不允许使用的StringBuilder。我想制作一个字符数组来保存数据,但因为我不知道树的大小我不知道所需数组的大小。 谢谢您的时间:))

1 个答案:

答案 0 :(得分:2)

直接进入中缀可能更容易,只需添加括号。

其次,做这样的事情将保存所有节点:

private String treeToPost(Node node) {
    String returnString = "";
    if (node != null) {
        returnString += treeToPost(node.left);
        returnString += treeToPost(node.right);
        returnString += node.data.getName();
    }
    return returnString;
}

对于中缀,这应该有效

private String treeToPost(Node node) {
    String returnString = "";
    if (node != null) {
        returnString += "(" + treeToPost(node.left);
        returnString += node.data.getName();
        returnString += treeToPost(node.right) + ")";
    }
    return returnString;
}

这些都是每次都创建新的String对象。所以我认为它在技术上是O(n ^ 2),因为弦每次增长,但我的教授不会为此扣除分数。 但是,如果要避免此行为,则无法使用StringBuilder。您可以使用CharArrayWriter。这是一个动态增长的缓冲区。然后,您可以制作两种方法。一个附加到缓冲区并且不返回任何内容的缓冲区。还有一个返回String的。然后,您将从String 1中调用缓冲区。