Java 文本文件中的通用二叉树
我试图创建一个从文本文件创建的通用二叉树。我正在寻找最好的方法,正确地这样做,并且已经尝试过了。在我的第一个方法中,BinaryTree(Scanner)是从绑定到文件的Scanner创建树的方法。然后leftInsert()插入left和rightInsert()插入right,我希望它们也是正确的。但我不知道如何正确地创建文本文件,以便也创建树 文本文件:Java 文本文件中的通用二叉树,java,algorithm,generics,binary-tree,java.util.scanner,Java,Algorithm,Generics,Binary Tree,Java.util.scanner,我试图创建一个从文本文件创建的通用二叉树。我正在寻找最好的方法,正确地这样做,并且已经尝试过了。在我的第一个方法中,BinaryTree(Scanner)是从绑定到文件的Scanner创建树的方法。然后leftInsert()插入left和rightInsert()插入right,我希望它们也是正确的。但我不知道如何正确地创建文本文件,以便也创建树 文本文件: A B C D E F 通用二叉树类: import java.ut
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);
}
}
}
}
import java.util.*;
导入java.io.*;
导入org.w3c.dom.Node;
私有类节点{
公共价值观;
公共子节点;
公共节点右子节点;
公共节点(E值){
leftChild=null;
rightChild=null;
这个值=值;
}
}
公共类二叉树{
私有节点根;
//这里最大的问题
公共二叉树(扫描程序){
//读取文件以创建树
}
公共void leftInsert(节点,E值){
如果((值).compareTo(节点值)<0){
if(Node.leftChild==null){
Node.leftChild=新节点(值);
}否则{
leftInsert(Node.leftChild,值);
}
}
}
public void righinsert(节点,E值){
如果((值).compareTo(节点值)>=0){
if(Node.rightChild==null){
Node.rightChild=新节点(值);
}否则{
rightInsert(Node.rightChild,值);
}
}
}
}
耶!: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;
}
}
如中所示,您希望能够读入文本并从中生成树?如果这是从文本文件生成树的唯一方法,那么是的。或者有更简单的方法吗?好的。。做某事:)这很有趣!没有做泛型或者很多Java风格的get/set封装,起诉我吧!这看起来很棒,真的!但这是错误的。BinaryTree(扫描仪)是从绑定到文件的扫描仪创建树。我创建了定义数据文件(文本文件)格式来指定二叉树,并创建了至少一个这样的输入文件!找一个扫描器,把每一行都扫描出来?是的,只要从文本文件中创建一棵树,如果需要更改文本文件,那么就可以了。它只是读取文件并从文本文件创建树,例如逗号分隔的值、值之间的空格或每行一个值。但是我想知道我是否必须按照我的方式制作文件原始数据格式是什么。。。?我以为你是想从那个文件中建立?另外,你介意在这里重新解释你之前的评论吗对不起,把你弄糊涂了,是我的错。简单地说,文本文件看起来像
abcdefg
,您必须从中创建一个二叉树。是的,只需要一个扫描器,获取每一行并创建一棵树。但我不知道如何使用扫描仪制作这棵树。忘记最后的评论吧。
A: {
B: {
D: {
}
E: {
F: {
}
G: {
}
}
}
C: {
}
}