作为我的任务的一部分,我获得了一个表达式树,我需要将其转换为具有O(n)运行时的in-fix。 例如,
将此树转换为“((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。我想制作一个字符数组来保存数据,但因为我不知道树的大小我不知道所需数组的大小。 谢谢您的时间:))
答案 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中调用缓冲区。