java-如何从二维数组生成树

java-如何从二维数组生成树,java,tree,Java,Tree,我想从数组(比如字符串)生成一棵树,但我不知道怎么做 我的输入阵列: [a, f, d, s] [a, f, w] [b, r] [a, p] [b, n, l] 我想做一棵这样的树: Root b r n l a f w d s p 这是我目前的代码: public class TreeGenerator { public TreeGenerator(E root, E[][] array){ List

我想从数组(比如字符串)生成一棵树,但我不知道怎么做

我的输入阵列:

[a, f, d, s]
[a, f, w]
[b, r]
[a, p]
[b, n, l]
我想做一棵这样的树:

Root 
 b 
  r 
  n 
   l 
 a 
  f
   w 
   d
    s 
  p
这是我目前的代码:

public class TreeGenerator {
    public TreeGenerator(E root, E[][] array){
        List list = Arrays.asList(array);//makes list
        Set set = new HashSet(list);//then set
        Node tree = new Node(root, set, 0);//makes whole tree

        System.out.println(tree.toString());//displays tree
    }

    public static void main(String[] args) {
        String[][] array = new String[][] { { "a", "f", "d", "s" }, { "a", "f", "w" }, { "b", "r" }, { "a", "p" }, { "b", "n", "l" } };
        for(String[] s : array){
            System.out.println(Arrays.toString(s));
        }
        new TreeGenerator("Root", array);
    }
}






public class Node {
    private final E nodeName;
    private final Node[] children;
    private final int depth; 
    /**
     * Constructs a Node and its children.
     *
     * @param name Node name
     * @param array Set of arrays
     * @param depth Index of arrays
     */
    public Node(E name, Set array, int depth) {
        nodeName = name;
        this.depth = depth;
        Map map = new HashMap();

        for (E[] line : array) { //iterates over arrays
            if (line.length > depth) { //checks if an element exists at this depth
                E common = line[depth]; //gets an element
                Set branch = map.get(common); //gets a branch for the element
                if (branch == null) { //if first such an element
                    branch = new HashSet(); //creates branch
                    map.put(common, branch); //adds for the element
                }
                branch.add(line); //adds the line for proper branch
            }
        }
        children = new Node[map.size()];
        int i = 0;
        depth++;//gets deeper
        for (Map.Entry entry : map.entrySet()) {//iterates over map
            children[i] = new Node(entry.getKey(), entry.getValue(), depth);//makes child
            i++;
        }
    }
}

您的代码有点混乱,您不应该在
节点的构造函数中递归地创建整个结构。所以我提供了一些伪代码

define generateTree:
    input: string[][] struct
    output: tree

    node root

    //each string[] describes on path from the root to a leaf of the tree
    for string[] s in struct
        node tmp = root

        //complete a path
        for string n in s
            //check whether the next node is already part of the tree
            if hasChild(tmp , n)
                //continue with the next node in the path
                tmp = getChild(tmp , n)
            else
                //next node doesn't exist -> create it first
                node child = new node(n)
                add(tmp , child)
                tmp = child

    return tree(root)

尽管这种表示形式效率很低,并且会为更大的平衡树生成大量数据。

我看不出2d数组如何转换为树。您尝试实现的树是一个名为Trie的数据结构,只需谷歌一下即可。