【问题标题】:Generic Binary tree from Text File来自文本文件的通用二叉树
【发布时间】:2015-06-25 14:42:27
【问题描述】:

我正在尝试创建一个从文本文件创建的通用二叉树。我正在寻找最好的方法并正确地这样做并且已经尝试过。在我的第一种方法中,BinaryTree(Scanner) 是从与文件绑定的扫描仪创建树的方法。然后 leftInsert() 向左插入, rightInsert() 向右插入,我希望这些也是正确的。但我不确定如何正确制作文本文件以便制作树。

文本文件:

    A
    B
    C
    D 
    E
    F        

通用二叉树类:

import java.util.*;
import java.io.*;

import org.w3c.dom.Node;

private class Nodes<E> {

    public E value;
    public Nodes<E> leftChild;
    public Nodes<E> rightChild;

    public Nodes(E value) {
        leftChild = null;
        rightChild = null;
        this.value = value;
    }
}

public class BinaryTree<E> {

private Node root;


// biggest issue here
public BinaryTree(Scanner){
// reads a file to create a tree
}

public void leftInsert(Nodes<E> Node, E value) {

    if ((value).compareTo(Node.value) < 0) {

        if (Node.leftChild == null) {

            Node.leftChild = new Nodes<E>(value);

        } else {

            leftInsert(Node.leftChild, value);

        }
    }

}

public void rightInsert(Nodes<E> Node, E value) {

    if ((value).compareTo(Node.value) >= 0) {

        if (Node.rightChild == null) {

            Node.rightChild = new Nodes<E>(value);

        } else {

            rightInsert(Node.rightChild, value);

        }
    }

}
}

【问题讨论】:

  • 如,您希望能够读取该文字并从中生成一棵树?
  • 如果这是从文本文件中创建树的唯一方法,那么可以。或者有更简单的方法吗?
  • 好吧.. 做点什么 :) 这很有趣!
  • 没有做泛型或大量 Java 风格的 get/set 封装,告我!

标签: java algorithm generics binary-tree java.util.scanner


【解决方案1】:

耶! :D

import java.util.ArrayList;
import java.util.Scanner;
import java.util.HashMap;
import java.util.regex.*;
public class Tree {
    public static void main(String[] args) {
        (new Tree()).build();
    }
    private ArrayList<Node> nodes;
    private ArrayList<Link> links;
    public void build() {
        nodes = new ArrayList<Node>();
        links = new ArrayList<Link>();
        // Read in nodes and links
/*
    A
   / \
  B   C
 / \
D   E
   / \
  F   G
*/
        String input = "    A\n   / \\\n  B   C\n / \\\nD   E\n   / \\\n  F   G";
        int y = 0;
        for (String line : input.split("\n")) {
            Matcher matcher = Pattern.compile("[A-Z]").matcher(line);
            while (matcher.find()) {
                Node node = new Node();
                node.name = matcher.group();
                node.x = matcher.start();
                node.y = y;
                nodes.add(node);
            }
            matcher = Pattern.compile("[/\\\\]").matcher(line);
            while (matcher.find()) {
                Link link = new Link();
                link.x = matcher.start();
                link.y = y;
                links.add(link);
            }
            ++y;
        }
        // Join the nodes
        for (Node node : nodes) {
            Node left = getNodeAt(node.x - 2, node.y + 2);
            if (left != null && hasLinkAt(node.x - 1, node.y + 1))
                node.left = left;
            Node right = getNodeAt(node.x + 2, node.y + 2);
            if (right != null && hasLinkAt(node.x + 1, node.y + 1))
                node.right = right;
        }
        // Great success!
        nodes.get(0).print(0);
    }
    private Node getNodeAt(int x, int y) {
        for (Node node : nodes)
            if (node.x == x && node.y == y)
                return node;
        return null;
    }
    private boolean hasLinkAt(int x, int y) {
        for (Link link : links)
            if (link.x == x && link.y == y)
                return true;
        return false;
    }
    private class Node {
        private int x, y;
        private String name;
        private Node left, right;
        public void print(int indent) {
            String indentString = "";
            for (int i = 0; i < indent; ++i, indentString += "    ") {}
            System.out.println(indentString + name + ": {");
            if (left != null)
                left.print(indent + 1);
            if (right != null)
                right.print(indent + 1);
            System.out.println(indentString + "}");
        }
    }
    private class Link {
        private int x, y;
    }
}

证明巨大成功的输出:

A: {
    B: {
        D: {
        }
        E: {
            F: {
            }
            G: {
            }
        }
    }
    C: {
    }
}

【讨论】:

  • 这看起来很棒,确实如此!但它是错误的。 BinaryTree(Scanner) 是从与文件绑定的 Scanner 创建树。我创建了定义的数据文件(文本文件)格式来指定二叉树并创建至少一个这样的输入文件。
  • 好的,所以改变它使用文字字符串的部分!获取扫描仪,并获取每一行?
  • 是的,只需从文本文件创建一棵树,如果有必要更改文本文件,那没关系。它只是读取文件并从文本文件创建树,例如逗号分隔值、值之间的空格或每行一个值。但我想知道是否必须按照我的方式制作文件
  • 原始数据格式是什么...?我以为您正在尝试从该文件构建?另外,您介意在那里重新解释您之前的评论吗? :S
  • 很抱歉让您感到困惑,我的错。只是文本文件看起来像A B C D E F G,你必须从中创建一个二叉树。是的,只需获取扫描仪并获取每一行并创建树。但我不确定如何使用扫描仪制作树。忘记最后一条评论。
猜你喜欢
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多