如何使用文本文件递归制作树?

时间:2018-02-04 19:43:39

标签: java recursion tree

我有一个包含以下内容的文本文件:

public static void fromPreOrder(BufferedReader br) throws IOException {
    String line = br.readLine();
    if (!line.startsWith("*")) {
        return;
    }
    TreeNode fromPreOrderTree = new TreeNode(line);
    line = br.readLine();
    if (line.startsWith("*"));
    fromPreOrderTree.left = new TreeNode(line);
    fromPreOrder(br);

}

句子以'1'开头是一个问题。这些行是预先安排的树。我想使用带有方法的缓冲读取器递归生成。 我希望树看起来如下:

let favorites = JSON.parse(localStorage.getItem('favoList'))|| {};

favorites[norrisJoke.id] =norrisJoke.joke 

我正在努力制作这种方法,我相信基本情况是新线是答案而不是问题。到目前为止,我有这个:

favorites.length

但它不能按预期工作。

2 个答案:

答案 0 :(得分:0)

您没有给出TreeNode的实现,因此下面的代码未经过测试,但总体结构应该大致正确:

public static void fromPreOrder(BufferedReader br) throws IOException {
    String line = br.readLine();
    if (line.startsWith("1")) {
        // recursive call:
        // parse two subtrees from the remaining lines
        TreeNode yChild = fromPreOrder(br);
        TreeNode nChild = fromPreOrder(br);

        // build the parent node from the question and 
        // the two child nodes
        String question = line;
        return TreeNode(question, yChild, nChild);
    } else {
        // base case: return single line
        // which contains a fixed decision, without
        // further questions
        return TreeNode(line);
    }
}

这个想法是这样的:你的递归方法应该返回一个TreeNode。两种可能的树节点是什么?

  • 叶子节点:固定决策,不包含任何进一步的问题
  • 决策节点,由一个问题和两个较小的TreeNode结构组成。

第一种情况是微不足道的。第二种情况需要两次递归调用。第一个调用解析y - 分支,第二个调用解析n - 分支。解析完两个分支后,将问题添加到其中,并将它们组合到一个节点中并返回该分支。

答案 1 :(得分:0)

代码

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

class TreeNode {
    TreeNode left;
    TreeNode right;
    String text;
}

public class SO {

    public static void main(final String... args) throws IOException {
        try (BufferedReader br = new BufferedReader(new FileReader("data.txt"))) {
            TreeNode node = readNode(br);
        }
    }

    public static TreeNode readNode(BufferedReader reader) throws IOException {
        String text = reader.readLine();
        if (text.charAt(0) == '1') {
            TreeNode node = new TreeNode();
            node.text = text.substring(1);
            node.left = readNode(reader);
            node.right = readNode(reader);
            return node;
        } else {
            TreeNode node = new TreeNode();
            node.text = text;
            return node;
        }
    }
}

解释

对于每个节点,如果以1开头,我们读取它和2个子节点,否则我们只读取当前节点。