Java 递归toString二叉树输出

Java 递归toString二叉树输出,java,recursion,binary-tree,binary-search-tree,tostring,Java,Recursion,Binary Tree,Binary Search Tree,Tostring,所以我希望我的二叉树的打印输出读起来像[abcdef],但是我总是得到一个额外的空间,我不能使用子字符串来删除它。最好的方法是什么 public String toStringInOrder() { output = ""; output += printInOrder(root); if(output.length() < 1) { return "[]"; } else {

所以我希望我的二叉树的打印输出读起来像[abcdef],但是我总是得到一个额外的空间,我不能使用子字符串来删除它。最好的方法是什么

public String toStringInOrder() {
        output = "";
        output += printInOrder(root);
        if(output.length() < 1) {
            return "[]";
        } else {
            return "[" + output.substring(0, output.length() - 1) + "]";
        }  
    }

private String printInOrder(Node current) {
        if(current != null) {
            printInOrder(current.left);
            output += current.value + " ";
            printInOrder(current.right);
        }
        return output;
    }
公共字符串toString-Order(){
输出=”;
输出+=打印顺序(根);
if(output.length()<1){
返回“[]”;
}否则{
返回“[”+output.substring(0,output.length()-1)+”];
}  
}
私有字符串printInOrder(节点当前){
如果(当前!=null){
打印顺序(当前。左侧);
输出+=当前值+“”;
打印顺序(当前。右侧);
}
返回输出;
}

如果您唯一关心的是删除末端的多余空间,则可以更换:

return "[" + output.substring(0, output.length() - 1) + "]";
与:


我可能采取的另一种方法是用有序值填充列表,然后您可以更好地控制如何将有序值格式化为字符串。

如果您不能使用子字符串或类似字符串,请执行“查找最大节点”搜索(廉价日志(n)操作),保存该节点并在输出添加上添加if语句,该语句检查必须添加其信息的节点是否不是最后一个节点。在这种情况下,添加不带空格的值

Node last = max(root);

private Node max(Node x){
    if (x.right == null) 
        return x;
    return max(x.right);
}

private String printInOrder(Node current) {

        if(current != null) {
            printInOrder(current.left);
            if(!current.equals(last))
                output += current.value + " ";
            else
                output += current.value;
            printInOrder(current.right);
        }
        return output;
    }

经过一些图解和反复试验,我找到了我需要的答案

private String printPreOrder(Node current) {
    if (current != null) {
        output += current.value;
        if (current.left != null) output += " ";
        printPreOrder(current.left);
        if (current.right != null) output += " ";
        printPreOrder(current.right);
    }
    return output;
}

对顺序和后序的一些更改获得了类似的结果。谢谢大家的帮助

在处理BST时,使用额外的有序列表(主要被认为是以最佳方式执行有序操作)在我看来不是一个很好的选择。@Matt函数已经在创建一个有序列表,只是字符串格式。通过修改列表对象,您将避免字符串串联操作(如果节点数量很大,则成本可能会很高)。一旦你有了有序列表,你就可以在花哨的格式方面做更多的事情,也可以更容易地使用StringBuilder。@Matt我被特别指示不要使用修剪或子字符串。必须找到一个遍历实现来完成这个任务。不幸的是,这个任务有大O的要求,所以我不能添加另一个搜索方法。从评分规则中:TOSTRINGORDER、toStringPreOrder、toStringPostOrder、O(N)*方括号内的返回值:[和]*仅用一个空格分隔值*开头或结尾不添加空格*创建返回值时不使用String.trim或删除字符空树将生成两个字符的toString值:[]包含单个字符串“a”的树将生成三个字符的toString值:[a]
private String printPreOrder(Node current) {
    if (current != null) {
        output += current.value;
        if (current.left != null) output += " ";
        printPreOrder(current.left);
        if (current.right != null) output += " ";
        printPreOrder(current.right);
    }
    return output;
}