【问题标题】:Java BNST toStringJava BNST toString
【发布时间】:2018-08-01 21:02:01
【问题描述】:

所以我正在研究一个实现二叉搜索树的学校项目。我必须创建一个 toString 方法,将所有节点作为字符串返回。我能够做到这一点,但我很难弄清楚如何返回所有节点的字符串。

这是我的工作 void toString 函数。

public void toString(TreeNode node)
{

        if (node == null) {
            return;
        }

        if (node.deleted == true) {
            System.out.print("*" + node.key + " ");
        } 
        else {
            System.out.print(result += node.key + " ");
        }

        toString(node.leftChild);
        toString(node.rightChild);

}

所以我想弄清楚的是如何让它返回树中所有节点的字符串。我尝试了以下方法,但它只返回第一个节点,因为它无法进入递归。

public String toString(TreeNode node)
{
    String result="";

        if (node == null) {
            return "";
        }

        if (node.deleted == true) {
            result += "*" + node.key + " ";
        }
        else {
            result += node.key + " ";
        }

        toString(node.leftChild);
        toString(node.rightChild);

        return result;

}

任何帮助将不胜感激。先感谢您。

【问题讨论】:

  • 结果字符串的期望格式是什么?解决方法很简单,只需要处理嵌套的toString()调用的结果即可。

标签: java string testing return binary-search-tree


【解决方案1】:

其实我想我只是想通了。这就是我所做的,它似乎正在正常工作。

public String toString(TreeNode node)
{
    String result="";

        if (node == null) {
            return "";
        }

        if (node.deleted == true) {
            result += "*" + node.key + " ";
        }
        else {
            result += node.key + " ";
        }

        result += toString(node.leftChild);
        result += toString(node.rightChild);

        return result;

}

【讨论】:

    【解决方案2】:

    此代码可能受益于显式使用StringBuilder,从而避免创建中间字符串实例:

    public String toString(TreeNode node) {
        return appendTo(node, new StringBuilder()).toString();
    }
    private static StringBuilder appendTo(TreeNode node, StringBuilder sb) {
        if(node == null) return sb;
        if(node.deleted) sb.append('*');
        return appendTo(node.rightChild,
                            appendTo(node.leftChild, sb.append(node.key).append(' ')));
    }
    

    但即使使用字符串连接,也不需要那么复杂:

    public String toString(TreeNode node) {
        if(node == null) return "";
        return (node.deleted? "*": "") + node.key + ' '
          + toString(node.leftChild) + toString(node.rightChild);
    }
    

    这仍然比原始版本创建更少的中间字符串实例。

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2020-06-06
      相关资源
      最近更新 更多