Java 递归toString二叉树输出
所以我希望我的二叉树的打印输出读起来像[abcdef],但是我总是得到一个额外的空间,我不能使用子字符串来删除它。最好的方法是什么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 {
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;
}