二叉搜索树的 toString 方法
toString method for binary search tree
请帮助我修复我的代码。
对于toString
方法,字符串的格式应为
{currentData, leftSubtree, rightSubtree}
一棵空树应该return一组空括号{}
。
对于我得到的 Junit 测试:
Expected: {5, {0, {-5, {}, {}}, {3, {}, {}}}, {10, {7, {}, {}}, {13, {}, {}}}}
Actual: {5, {0, {-5, {}, {3, {}, {}, {10, {7, {}, {13, {}, {}, {}}
这是我的代码:
public String toString() {
StringBuffer string = new StringBuffer("{");
toString(root, string);
string.append("}");
return string.toString();
}
private void toString(BSTNode<T> node, StringBuffer string) {
if (node != null) {
string.append(node.getData());
if (node.getLeft() != null) {
string.append(", " + "{");
toString(node.getLeft(), string);
}
if (node.getRight() != null) {
string.append(", " + "{");
toString(node.getRight(), string);
}
}
string.append(", {}");
}
谢谢!!
您的代码在递归调用自身之前添加 {
,但不会在 return 上添加 }
。这适用于两个递归调用。
此外,您的代码无条件附加 , {}
,即使对于非空树也是如此。
相反,编写你的递归方法来完全按照你所说的去做:
- 格式为
{currentData, leftSubtree, rightSubtree}
- 将空树格式化为
{}
不要让调用者的工作是在值周围添加 {
}
,因为这会重复逻辑(DRY:不要重复自己)。
预期输出还显示叶节点的格式应为 {value, {}, {}}
,而不是 {value}
,这是您的代码对那些额外的 if
语句所做的。
还有,不要用StringBuffer
,用StringBuilder
,递归的方法可以是static
.
@Override
public String toString() {
StringBuilder string = new StringBuilder();
toString(this.root, string);
return string.toString();
}
private static <T> void toString(BSTNode<T> node, StringBuilder string) {
string.append('{');
if (node != null) {
string.append(node.getData());
string.append(", ");
toString(node.getLeft(), string);
string.append(", ");
toString(node.getRight(), string);
}
string.append('}');
}
如果您将递归方法 return 改为 StringBuilder
,如果您喜欢压缩代码,您的代码会变得更小。在功能或性能方面没有区别。如果你翻转参数,它会更好读。
@Override
public String toString() {
return toString(new StringBuilder(), this.root).toString();
}
private static <T> StringBuilder toString(StringBuilder string, BSTNode<T> node) {
string.append('{');
if (node != null) {
string.append(node.getData());
toString(string.append(", "), node.getLeft());
toString(string.append(", "), node.getRight());
}
return string.append('}');
}
请帮助我修复我的代码。
对于toString
方法,字符串的格式应为
{currentData, leftSubtree, rightSubtree}
一棵空树应该return一组空括号{}
。
对于我得到的 Junit 测试:
Expected: {5, {0, {-5, {}, {}}, {3, {}, {}}}, {10, {7, {}, {}}, {13, {}, {}}}}
Actual: {5, {0, {-5, {}, {3, {}, {}, {10, {7, {}, {13, {}, {}, {}}
这是我的代码:
public String toString() {
StringBuffer string = new StringBuffer("{");
toString(root, string);
string.append("}");
return string.toString();
}
private void toString(BSTNode<T> node, StringBuffer string) {
if (node != null) {
string.append(node.getData());
if (node.getLeft() != null) {
string.append(", " + "{");
toString(node.getLeft(), string);
}
if (node.getRight() != null) {
string.append(", " + "{");
toString(node.getRight(), string);
}
}
string.append(", {}");
}
谢谢!!
您的代码在递归调用自身之前添加 {
,但不会在 return 上添加 }
。这适用于两个递归调用。
此外,您的代码无条件附加 , {}
,即使对于非空树也是如此。
相反,编写你的递归方法来完全按照你所说的去做:
- 格式为
{currentData, leftSubtree, rightSubtree}
- 将空树格式化为
{}
不要让调用者的工作是在值周围添加 {
}
,因为这会重复逻辑(DRY:不要重复自己)。
预期输出还显示叶节点的格式应为 {value, {}, {}}
,而不是 {value}
,这是您的代码对那些额外的 if
语句所做的。
还有,不要用StringBuffer
,用StringBuilder
,递归的方法可以是static
.
@Override
public String toString() {
StringBuilder string = new StringBuilder();
toString(this.root, string);
return string.toString();
}
private static <T> void toString(BSTNode<T> node, StringBuilder string) {
string.append('{');
if (node != null) {
string.append(node.getData());
string.append(", ");
toString(node.getLeft(), string);
string.append(", ");
toString(node.getRight(), string);
}
string.append('}');
}
如果您将递归方法 return 改为 StringBuilder
,如果您喜欢压缩代码,您的代码会变得更小。在功能或性能方面没有区别。如果你翻转参数,它会更好读。
@Override
public String toString() {
return toString(new StringBuilder(), this.root).toString();
}
private static <T> StringBuilder toString(StringBuilder string, BSTNode<T> node) {
string.append('{');
if (node != null) {
string.append(node.getData());
toString(string.append(", "), node.getLeft());
toString(string.append(", "), node.getRight());
}
return string.append('}');
}