【问题标题】:toString method for binary search tree二叉搜索树的 toString 方法
【发布时间】:2016-06-05 00:21:57
【问题描述】:

请帮我修复我的代码。

对于toString 方法,字符串格式应为

{currentData, leftSubtree, rightSubtree}

一棵空树应该返回一组空括号{}

对于我得到的 Junit 测试:

Expected: {5, {0, {-5, {}, {}}, {3, {}, {}}}, {10, {7, {}, {}}, {13, {}, {}}}}
Actual:   {5, {0, {-5, {}, {3, {}, {}, {10, {7, {}, {13, {}, {}, {}}

这是我的代码:

public String toString() {
    StringBuffer string = new StringBuffer("{");
    toString(root, string);
    string.append("}");
    return string.toString();
}

private void toString(BSTNode<T> node, StringBuffer string) {

    if (node != null) {
        string.append(node.getData());
        if (node.getLeft() != null) {
            string.append(", " + "{");
            toString(node.getLeft(), string);
        }
        if (node.getRight() != null) {
            string.append(", " + "{");
            toString(node.getRight(), string);
        }
    }
    string.append(", {}");
}

谢谢!!

【问题讨论】:

  • 您是否在 IDE 调试器中跟踪过代码?你看到了什么?
  • 递归后你永远不会写出结束括号
  • 使用StringBuilder,而不是StringBuffer
  • 每个节点都会无条件追加", {}",不管是否为空? 真的吗?

标签: java binary-search-tree


【解决方案1】:

您的代码在递归调用自身之前添加{,但在返回时不添加}。这适用于两个递归调用。

此外,您的代码无条件附加 , {},即使对于非空树也是如此。


相反,编写递归方法来完全按照你说的做:

  • 格式为{currentData, leftSubtree, rightSubtree}
  • 将空树格式化为{}

不要让调用者在值周围添加{ },因为这会重复逻辑(DRY:不要重复自己)。

预期的输出还显示叶节点的格式应为{value, {}, {}},而不是{value},这是您的代码对那些额外的if 语句所做的。

另外,不要使用StringBuffer,使用StringBuilder,递归方式可以是static

@Override
public String toString() {
    StringBuilder string = new StringBuilder();
    toString(this.root, string);
    return string.toString();
}
private static <T> void toString(BSTNode<T> node, StringBuilder string) {
    string.append('{');
    if (node != null) {
        string.append(node.getData());
        string.append(", ");
        toString(node.getLeft(), string);
        string.append(", ");
        toString(node.getRight(), string);
    }
    string.append('}');
}

如果你让递归方法返回StringBuilder,你的代码可以变得更小,如果你喜欢压缩你的代码。在功能或性能方面没有区别。如果你翻转参数,它会更好读。

@Override
public String toString() {
    return toString(new StringBuilder(), this.root).toString();
}
private static <T> StringBuilder toString(StringBuilder string, BSTNode<T> node) {
    string.append('{');
    if (node != null) {
        string.append(node.getData());
        toString(string.append(", "), node.getLeft());
        toString(string.append(", "), node.getRight());
    }
    return string.append('}');
}

【讨论】:

  • 你赢了 :) 最后一块 +1
猜你喜欢
  • 2016-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多