当前位置: 首页 > 知识库问答 >
问题:

二叉查找树的toString方法

彭鸿彩
2023-03-14

请帮我修复我的代码。

对于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个答案

阴宏爽
2023-03-14

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

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

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

    < li >格式为< code>{currentData,leftSubtree,rightSubtree} < li >将空树格式化为< code>{}

不要让调用者在值周围添加< code>{ },因为这将重复逻辑(DRY:不要重复)。

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

还有,不要用< code>StringBuffer,用< code>StringBuilder,递归方法可以是< code>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('}');
}

如果您让递归方法返回< code>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('}');
}
 类似资料:
  • 主要内容:什么是二叉排序树?,使用二叉排序树查找关键字,二叉排序树中插入关键字,二叉排序树中删除关键字,总结前几节介绍的都是有关静态 查找表的相关知识,从本节开始介绍另外一种查找表—— 动态查找表。 动态查找表中做查找操作时,若查找成功可以对其进行删除;如果查找失败,即表中无该关键字,可以将该关键字插入到表中。 动态查找表的表示方式有多种,本节介绍一种使用树结构表示动态查找表的实现方法—— 二叉排序树(又称为 “二叉查找树”)。 什么是二叉排序树? 二叉排序树要么是空 二叉树,要么具有如下特点:

  • 我正在努力实现二叉搜索树。完成实现所需的功能之一是重新平衡功能。 根据规范,该功能的工作方式如下: rebalance() 方法应创建一个平衡树,从而将偏度降低为零。平衡树是指在整个树中,左子树和右子树的大小相差不超过1(即,每个子树也是平衡的)。 为了平衡树,rebalance() 方法应反复将根值移动到较小的子树,并将最小/最大值从较大的子树移动到根,直到树平衡。然后,它应该以递归方式平衡两个

  • 我很难按我教授想要的格式打印出一个二叉搜索树。 他的格式是这样的: 我的代码:

  • 我们已经看到了两种不同的方法来获取集合中的键值对。回想一下,这些集合实现了 map 抽象数据类型。我们讨论的 map ADT 的两个实现是在列表和哈希表上的二分搜索。在本节中,我们将研究二叉查找树作为从键映射到值的另一种方法。 在这种情况下,我们对树中项的确切位置不感兴趣,但我们有兴趣使用二叉树结构来提供高效的搜索。

  • 我正在尝试用单词构建二叉搜索树。然而,当我使用上面的代码时,我只能访问我的根,根的左、右子项似乎为空。 法典:

  • 我试图使用队列的链表实现实现二叉搜索树的级别顺序遍历。 我已经检查了二叉查找树的实现,它是好的。队列的链表实现也是正确的。在这里,我试图访问节点并将其子节点排队。然后使用弹出函数实际访问节点。 这最终是通过递归调用完成的。当我运行以下代码时,我以不同的顺序获得输出。