【发布时间】:2017-10-10 06:33:04
【问题描述】:
作为我的任务的一部分,我得到了一个表达式树,我需要将它转换为具有 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。我想制作一个字符数组来保存数据,但是因为我不知道树的大小,所以我不知道所需数组的大小。 谢谢你的时间:)
【问题讨论】:
-
您的算法只保存最后一个节点,因为您不保存来自 treeToPost(node.left, post) 和 treeToPost(node.right, post) 的结果
-
您可以使用中序遍历并插入每个节点的值,因为它们在树中按顺序显示,并在每次下一级(朝向叶子)时插入一个左括号和一个关闭 -每次升级一级时,请使用括号。这就是您创建树的中缀表示的方式。当然,这会引入包含单个术语的括号,但如果需要,这并不难修复。
标签: java database algorithm tree