我的一个关于树木的大学实验室要求我们编写一个名为D[i][j]
的方法。描述如下:
将树的内容表示为字符串的另一种方法是使用缩进列表。在这里,我们首先代表根,然后是每个 它的子子树,用两个空格缩进(这是应用的 递归)。对于示例树,我们将得到:
toIndentedString()
这是示例树的图表:
这是我目前的代码:
food
meat
chicken
beef
fish
salmon
cod
tuna
shark
fruit
vegetable
cabbage
如何实现此方法以便递归缩进子树?
答案 0 :(得分:1)
根据main
方法中提供的示例,您有一个字符串节点树(您的类称为"树"但术语"节点"是更适合他们的情况)。
正如你的作业所暗示的那样,递归是关键所在。您希望以递归方式遍历树节点,并在每次递归调用时传递递增的缩进级别。这些方面的东西。
private static final String INDENT_STRING = " ";
public String toIndentedString() {
StringBuilder sb = new StringBuilder();
this.buildIndentedString(sb, 0);
return sb.toString();
}
private void buildIndentedString(StringBuilder builder, int indentationLevel) {
for (int i = 0; i < indentationLevel; i++) {
builder.append(INDENT_STRING);
}
builder.append(rootValue != null ? rootValue.toString() : "null");
builder.append('\n');
// Recurse over the children, building the tree with a deeper indentation level.
for (Tree t : this.children) {
t.buildIndentedString(builder, indentationLevel+1);
}
}
递归方法buildIntentedString
是所有递归发生的地方。首先,我们向StringBuilder添加缩进间距。然后,我们将当前节点的对象追加为String(或者&#34; null&#34;如果我们有一个空对象)。最后,我们递归:迭代当前节点的子节点并使用增加的缩进级别执行相同的操作。您的示例的输出应该看起来像这样:
food
meat
chicken
beef
fish
salmon
cod
tuna
shark
fruit
vegetable
cabbage
答案 1 :(得分:1)
这是一个简单的递归实现:
public String toIndentedString() {
StringBuilder sb = new StringBuilder(rootValue.toString());
for (Tree<T> child : children) {
sb.append('\n');
sb.append(child.toIndentedString().replaceAll("(?m)^", " "));
}
return sb.toString();
}
首先,将根值转换为字符串,然后添加由换行符连接的每个子缩进字符串。要缩进子字符串的每一行,请使用替换正则表达式,在每行的前面添加缩进。