我想从数组生成树(例如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++;
}
}
}
答案 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)
虽然这种表示形式效率很低,但会为更大的平衡树生成大量数据。