二叉搜索树的toString方法

时间:2016-06-04 15:25:32

标签: java binary-search-tree

请帮我修改我的代码。

对于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(", {}");
}

谢谢!

1 个答案:

答案 0 :(得分:3)

您的代码在递归调用之前添加A = [5,6],但在返回时不添加{。这适用于两个递归调用。

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

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

  • 格式为, {}
  • 将空树格式化为{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