我创建了一个树形结构,类似于下面的图像。最初,每个节点都包含一组数字。
将子项添加到节点时,子项的数字集与父项的数字集的交集将存储在子项中。最后,父节点有一个集合,它基本上是所有子集集合的集合(任何不属于任何子集的数字都将被删除)。
为了做到这一点,我将所有数字存储在List(在Tree类中)中,并为每个节点提供两个索引(leftIndex,rightIndex)以从List中标识自己的一组数字。 (例如,在下面的树中,列表包含21个数字,节点A包含14个数字,在列表中为0到13)
节点结构:
public class Node<T> {
private List<Node<T>> children = new ArrayList<Node<T>>();
private Node<T> parent = null;
private T data = null;
public Node(T data){
this.data = data;
}
public Node(T data, Node<T> parent){
this.data = data;
this.parent = parent;
}
public List<Node<T>> getChildren(){
return children;
}
public void setParent(Node<T> parent){
this.parent = parent;
}
public void addChild(Node<T> child){
child.setParent(this);
this.children.add(child);
}
public Node<T> getParent() {
return parent;
}
public T getData() {
return this.data;
}
public void setData(T data) {
this.data = data;
}
public boolean isRoot() {
return (this.parent == null);
}
public boolean isLeaf() {
return this.children.size() == 0;
}
public void removeParent() {
this.parent = null;
}
public Node() {
}
}
NodeData:
public class NodeData{
private int leftIndex;
private int rightIndex;
private int level;
}
树形结构:
public class Tree<V>{
private String[] parameters;
private String[][] parameterValues;
private int height;
private Node<V> root;
private List<Long> aggregatedNumbersList = new ArrayList<>();//contains all the leaf node numbers
private List<Node<NodeData>> leafNodes = new ArrayList<>();
}
现在,根据上面的树,我想创建下面的树。在下面的树节点中修改了节点级别,但数字列表保持不变。每个层次结构包含与上述树相同的一组数字(例如,节点A,节点C对包含一组四个数字)。
那么,我该如何创建一个动态树,其中可以修改级别并添加任何新节点。