【问题标题】:java Binary Search Tree inorder recursively, return stringjava二叉搜索树递归排序,返回字符串
【发布时间】:2017-07-06 08:09:12
【问题描述】:

我有一个 toString 方法,它应该按顺序返回一个表示整个二叉搜索树的字符串。我已经走了这么远,但这只是按顺序打印出数字,而 toString 方法当然只是返回 rootNode 的值。我不知道我应该如何解决这个问题。

@Override
public String toString() {
    if (rootNode == null){
        return "";
    }
    else {
        return inorder(rootNode.data);
    }
}

/** 
 * @param root
 */
public String inorder(Node<T> root){
    if (root != null){
        inorder(root.left);
        System.out.println(root.value + " ");
        inorder(root.right);
    }
}

我已经被这个问题困扰了好几个小时了。

【问题讨论】:

  • 有什么问题?您的描述与代码匹配。你对toString() 函数有什么期待?如果可能,请为您的程序提供完整的代码和示例输入/输出。
  • 不,toString 方法应该将整个 BST 作为一个字符串返回,而不仅仅是打印出来。
  • 问题是,在void inorder(Node)中,他对打印不感兴趣,而是在inorder(Node)方法内部生成一个String序列,所以,在调用String之后s = inorder(Node), s 将以中序结构打印树,如果他有兴趣从 toString() 方法发回结果,则 inorder(Node) 需要返回 String
  • 现在inorder 方法打印每个节点,因为它访问它。如果你想 return 整个树,你必须返回一个字符串值(即不是 void)并将子树添加到当前节点值。

标签: java recursion binary-search-tree tostring inorder


【解决方案1】:

也许你可以试试这个

@Override
public String toString() 
{
    java.lang.StringBuilder toReturn = new java.lang.StringBuilder();  
    if (rootNode == null){
        return "";
    }
    else{
        inorder(rootNode.data , toReturn);
    }
    return toReturn.toString();
}

/** 
 * @param root
 */
public void inorder(Node<T> root , java.lang.StringBuilder treeLikeStringBuilder){
    if (root != null){
        inorder(root.left);
        System.out.println(root.value + " ");
        treeLikeStringBuilder.append( root.value.toString() + " " );
        inorder(root.right);
    }
}

inorder(Node, StringBuilder) 签名将有助于为中序遍历构建类似字符串的结构,以便 toString() 可以返回该字符串中序遍历,也使用 StringBuilder 以便对 MUTABLE StringBuilder 所做的更改传递作为方法 inorder(Node , StringBuilder) 的参数 (StringBuilder toReturn) 将反映 toString() 方法中的更改,希望对您有所帮助??

【讨论】:

    【解决方案2】:

    下面的算法简化了你的任务,它所做的只是根据 inOrder 算法访问每个节点并将该节点数据附加到字符串中。

    public void inOrder(Node<T> root, string NodeData){ // Algorithm for inOrder - "left child node, root, right child node"
        if (root != null){
            inOrder(root.left, NodeData);  // traverse left sub tree
            NodeData += root.Data.ToString() + "  |  "; // append to NodeData
            inOrder(root.right, NodeData); // traverse right sub tree
        }
    }
    

    像这样调用方法:

    string TreeNodeData = "";
    Tree.inOrder(ENTER ROOT OF TREE HERE, TreeNodeData);
    

    最后,您可以通过以下方式检查结果:

    System.out.println(TreeNodeData);
    

    【讨论】:

    • 这是错误的,您不能在 Java 中通过引用传递 NodeData。它不会通过多次调用带来新的价值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 2014-01-02
    • 2021-09-01
    • 1970-01-01
    • 2021-07-03
    相关资源
    最近更新 更多