Question

I'm trying to create a decision tree from a text file.

public static BTNode<String> fileToTree (String fileName) throws IOException {
    BufferedReader file = new BufferedReader(new FileReader(fileName));
    BTNode<String> node = new BTNode("", null, null);
    BTNode<String> answer = fileToTreeHelper(node, file);
    file.close();
    return answer;
}
   public static BTNode<String> fileToTreeHelper (BTNode<String> node, Scanner fileScanner) throws IOException {
    String line;

    if(node == null){
            node = new BTNode<String>(fileScanner.nextLine(), null, null);
            fileToTreeHelper(node, fileScanner);
    }else{
        if(fileScanner.hasNext()){
                if(node.isLeaf()){
                    node.setData(fileScanner.nextLine());
                }
                if(node.getLeft() == null) {
                    line = fileScanner.nextLine();
                        if(line.contains("?")) {
                            node.setLeft(new BTNode<String>(line, null, null));
                        }
                        if(line.contains(";")) {
                             node.setLeft(new BTNode<>(line,null, null));
                             node.setRight(new BTNode<>(fileScanner.nextLine(),null, null));
                        }
                    }

                if(node.getRight() == null) {
                    line = fileScanner.nextLine();
                    if(line.contains("?")) {
                        node.setRight(new BTNode<String>(line, null, null));
                    }
                    if(line.contains(";")) {
                         node.getLeft().setLeft(new BTNode<>(line,null, null));
                         node.getLeft().setRight(new BTNode<>(fileScanner.nextLine(),null, null));
                         node.setRight(new BTNode<String>(line, null, null));
                         fileToTreeHelper(node.getRight(), fileScanner);
                    }
               }
            }
        }
    return node;
}

This is what I have so far; when I run it the decision tree should look something like this:

Are you a mammal?
   Are you bigger than a cat?
      Kangaroo;
      Mouse;
   Do you live underwater?
      Trout;
      Robin;

But so far all I am getting is this:

Are you a mammal?
    Are you bigger than a cat?
        Kangaroo;
        --
    --

Any help on how to do this? I know I need to recursively call this function but this is not working quite well. Any ideas?

Was it helpful?

Solution

I think your algorithm is confusing, it should be something like this:

    Node node = new Node(fileScanner.nextLine())
    // If the node is a question, it should have 2 subnodes with the answers / nested questions.
    if(line.contains("?")){
        node.setLeft(fileToTreeHelper(...));
        // If there is an option that has only 1 answer, then this should have an if that
        // checks if there is a ";" and then create the node or set it as null.
        node.setRight(fileToTreeHelper(...));
    }
    // If it is not a question, then it's just an answer to a previous question and returns.
    return node;

OTHER TIPS

I was able to solve it. Thanks. Works perfectly now.

public static BTNode<String> fileToTree (String fileName) throws IOException {
        BufferedReader file = new BufferedReader(new FileReader(fileName));
        BTNode<String> node = null;
        Scanner fileScanner = new Scanner (file);
        BTNode<String> answer = fileToTreeHelper(fileScanner);
        return answer;
    }

   public static BTNode<String> fileToTreeHelper (Scanner fileScanner) throws IOException {
           BTNode node = null;
           String line = fileScanner.nextLine();

           if(line.contains("?")){
               node = new BTNode<String>(line, null, null);
               node.setLeft(fileToTreeHelper(fileScanner));
               node.setRight(fileToTreeHelper(fileScanner)); 

           }else{
               node = new BTNode<String>(line, null, null);
               return node;

           }
           return node;
    }
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top