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

时间:2015-06-05 11:48:44

标签: java tree

我想从数组生成树(例如String),但我不知道该怎么做。

我的输入数组:

[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++;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

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)

虽然这种表示形式效率很低,但会为更大的平衡树生成大量数据。