二叉查找树的遍历方法,以toString
Binary search tree traversal method, in order toString
我用我自己的节点从头开始制作了一个二叉搜索树,当我添加节点时以及当我按顺序将树打印到控制台时,它可以完美地运行。但是,我花了一半时间让 toString
方法正常工作。
我将我的 toString
方法更改为 MakeString
,因为我认为它在将可比较类型数据转换为字符串时会变得混乱。我可以将方法获取到 return 个节点或仅以对象形式获取,但绝不能以字符串形式获取整棵树。 printInOrder()
方法非常有效,为什么我的 MakeString()
方法不行?
public void printInOrder(){
if (left != null) left.printInOrder();
System.out.println(data);
if (right != null) right.printInOrder();
}
public String MakeString(){
String OrderedTree;
StringBuilder sb = new StringBuilder();
if (data == null) return "Tree is empty";
if (left != null) left.MakeString();
sb.append(data);
if (right != null) right.MakeString();
如果你需要在整个递归过程中保留一些东西,那么它应该作为参数传递。如果您想避免必须准备初始调用或以其他方式在递归之前或之后做一些事情,这通常会产生一对方法。
在您的情况下,您使用的是 StringBuilder
,它需要在递归之前创建,在整个过程中保留,然后在之后使用。
例如:
public String MakeString() {
if (data == null)
return "Tree is empty";
StringBuilder sb = new StringBuilder();
MakeString(sb);
return sb.toString();
}
private void MakeString(StringBuilder sb) {
if (left != null)
left.MakeString(sb);
sb.append(data);
if (right != null)
right.MakeString(sb);
}
我用我自己的节点从头开始制作了一个二叉搜索树,当我添加节点时以及当我按顺序将树打印到控制台时,它可以完美地运行。但是,我花了一半时间让 toString
方法正常工作。
我将我的 toString
方法更改为 MakeString
,因为我认为它在将可比较类型数据转换为字符串时会变得混乱。我可以将方法获取到 return 个节点或仅以对象形式获取,但绝不能以字符串形式获取整棵树。 printInOrder()
方法非常有效,为什么我的 MakeString()
方法不行?
public void printInOrder(){
if (left != null) left.printInOrder();
System.out.println(data);
if (right != null) right.printInOrder();
}
public String MakeString(){
String OrderedTree;
StringBuilder sb = new StringBuilder();
if (data == null) return "Tree is empty";
if (left != null) left.MakeString();
sb.append(data);
if (right != null) right.MakeString();
如果你需要在整个递归过程中保留一些东西,那么它应该作为参数传递。如果您想避免必须准备初始调用或以其他方式在递归之前或之后做一些事情,这通常会产生一对方法。
在您的情况下,您使用的是 StringBuilder
,它需要在递归之前创建,在整个过程中保留,然后在之后使用。
例如:
public String MakeString() {
if (data == null)
return "Tree is empty";
StringBuilder sb = new StringBuilder();
MakeString(sb);
return sb.toString();
}
private void MakeString(StringBuilder sb) {
if (left != null)
left.MakeString(sb);
sb.append(data);
if (right != null)
right.MakeString(sb);
}