Java - 树中的缩进列表

时间:2017-05-11 23:15:34

标签: java string recursion tree

我的一个关于树木的大学实验室要求我们编写一个名为D[i][j]的方法。描述如下:

  

将树的内容表示为字符串的另一种方法是使用缩进列表。在这里,我们首先代表根,然后是每个   它的子子树,用两个空格缩进(这是应用的   递归)。对于示例树,我们将得到:

toIndentedString()

这是示例树的图表:

Example Tree

这是我目前的代码:

food
  meat
    chicken
    beef
    fish
      salmon
      cod
      tuna
      shark
  fruit
  vegetable
    cabbage

如何实现此方法以便递归缩进子树?

2 个答案:

答案 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();
}

Ideone Demo

首先,将根值转换为字符串,然后添加由换行符连接的每个子缩进字符串。要缩进子字符串的每一行,请使用替换正则表达式,在每行的前面添加缩进。