【问题标题】:Making a string of postorder data of a given tree制作给定树的后序数据字符串
【发布时间】: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


【解决方案1】:

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

其次,这样做会保存所有节点:

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。这是一个动态增长的缓冲区。然后,您可以制作两种方法。一个附加到缓冲区并且什么都不返回的。还有一个返回字符串。然后,您将从字符串一内部调用缓冲区一。

【讨论】:

  • 非常感谢您的回答!自己想都没想觉得有点傻,只是有点小括号打印太多的问题,很容易解决。
  • 没有太多的括号。只有括号是不必要的;)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多