- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要实现一个树状数据结构,其中每个节点都有多个父节点和子节点,因此有多个根节点。
新节点将仅作为没有父节点的根节点或一个或多个父节点的子节点添加到树中。
节点不会以子节点开始,但任何现有节点都可以通过任意数量的其他父节点获得另一个子节点
最佳答案
我能够创建一个 Node
类和 Graph
类(class)。我给了每个 Node
一个List<Node>
它们的父节点和子节点。
每个Node
跟踪它自己的直接 child 和 parent 。
节点实现
public class Node<T>{
private T data;
private List<Node<T>> parents;
private List<Node<T>> children = new ArrayList<>();//this can be initialized because a node will not start with children
public Node(T data){//adding a node without parents
this.data = data;
parents = new ArrayList<>();//make parents an empty ArrayList so other methods won't break with a null value
}
public Node(T data, List<Node<T>> parents){//adding a node with parents
this.data = data;
this.parents = parents;
}
//search methods
public List<Node<T>> getChildren(){return children;}//return only direct children
public List<Node<T>> getChildren(int level){return getChildren(new ArrayList<>(Collections.singletonList(this)),new ArrayList<>(),level);}//convenience method to find only this node's children to a certain level
public List<Node<T>> getChildren(List<Node<T>> find, List<Node<T>> found, int level){//level can be -1 to search through all children or a positive integer to only search the first n level of children.
if(level!=0){//setting level to -1 will never stop the search until all children have been found because level only goes down, because the level will never reach zero
for(Node<T> node:find){//can find the children of multiple nodes
if(node.hasChild()) {
for (Node<T> child : node.getChildren()) {
if (!found.contains(child)) {//trees can intersect, so the child may have already been found, so only add if it hasn't
found.add(child);
}
}
getChildren(node.getChildren(),found,level--);//recursively find the remaining children of the current node
}
}
}
return found;
}
//a method that finds parents can be implemented by modifying the getChildren() methods
//examples of other methods that can be added
public T getData(){return data;}
public boolean hasChild(){return children.size()>0;}
void addChild(Node<T> node){children.add(node);}
void addChildren(List<Node<T>> nodes){children.addAll(nodes);}
public List<Node<T>> getParents(){return parents;}
public boolean hasParent(){return parents.size()>0;}
void addParent(Node<T> node){parents.add(node);}
void addParent(List<Node<T>> nodes){parents.addAll(nodes);}
}
Graph
类仅用于跟踪图的根。根就是一个 Node
没有 parent 。可以针对您的特定用例调整每种方法的范围。此类旨在通过更具体的类进行扩展,其中包含用于处理您的特定数据类型的方法。
图实现:
public class Graph<T> {
private List<Node<T>> roots;
protected Tree(List<Node<T>> roots){this.roots = roots;}//Graph class can be initialized with or without existing roots
protected Tree(){roots = new ArrayList<>();}
public List<Node<T>> getRoots(){return roots;}
public List<Node<T>> getAllNodes(){
List<Node<T>> nodes = roots.get(0).getChildren(roots,new ArrayList<>(),-1);//loop through all roots with an empty list for nodes already found, because no nodes have been found yet
nodes.addAll(roots);
return nodes;
}
public void addNode(Node<T> node){
for(Node<T> parent:node.getParents()){//for each parent node add this node as their child
parent.addChild(node);
}
if(!node.hasParent())roots.add(node);
}
public void addNodes(List<Node<T>> nodes){
for(Node<T> node:nodes){
addNode(node);
}
}
}
添加新的 Node
时与 parent ,Graph
类获取 parent 并添加 Node
作为那些 parent 的 child ,所以 parent 节点知道他们有 child 节点。
关于java - 实现具有多个 parent 和 child 的图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59906194/
我的收藏具有以下结构 { _id:1, parent_id:0 } { _id:2, parent_id:1 } { _id:3, parent_id:1 } { _id:4, par
到目前为止,我已经尝试过获取该对象的所有子对象,但它只带来了两个子对象。不都是 child 的 child 。我如何获取所有内容并循环获取特定名称对象 Transform[] objChild = g
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我有一个如下表 好吧,在这个表中每个用户都有一个父用户,那么如果我们选择一个用户,那么它的 id 、子代 id 和子代子代 id 应该作为数组返回。我需要一个查询来获取 Rails 中的这些值,而不使
我需要以下代码的帮助: HTML: process process 在点击 td[class=process] 时,我需要 input[name=dat
好的,所以我从中获得了一个 PHP,该 PHP 由依赖于手头动态情况的切换循环传播(我认为)。现在,当我添加一个复选框时,我希望能够使 div 中的第一个复选框具有顶部边框和侧面,没有底部。下面的只有
我正在使用 Swift 和 Sprite Kit。我有一个名为 MrNode 的 SKNode,它有多个 SKSpriteNodes 和 SKNode 子节点。一些SKNode有子节点,而这些子节点也
对不起,这个标题太俗了,但我真的不确定如何解释这个,我是新一代的 SQL 技能由于事件记录模式而退化的人之一! 基本上我在 PostgreSQL 中有三个表 客户端(一个客户端有很多 map ) -
我有这样的简单表格: 编号 parent_id 创建于 具有父/子关系...如果一行是子行,则它有一个 parent_id,否则它的 parent_id 为 0。 现在我想选择所有没有子项(因此本身)
所以我有这样的结构: 我的问题是:如何从每个主题中删除 ID 为 3Q41X2tKUMUmiDjXL1BJon70l8n2 的每个字段。我正在考虑这样的事情: admin.database().ref
这个问题在这里已经有了答案: Change opacity on all elements except hovered one (1 个回答) 关闭 5 个月前。 因此,当鼠标悬停在 child
我需要在 Delphi 5 中创建一个 QuickReport,其布局如下: +================ | Report Header +================ +========
假设我有这样的 html: Some more detailed code.... 我想知道如何在CSS中使用“A
我有一个使用 flexbox 的类似表格的布局: +--------------+---------------+-----------------+---------------+ | 1
我有一个关联,其中 user has_many user_items 和 user_items has_many user_item_images。与一个已经退出的用户。我可以创建一个新的 user_
我想选择无序列表中的前两个列表项。我可以这样选择第一项: ul li:nth-child(1) a { background: none repeat scroll 0 0 beige; }
ul li:first-child a { border-radius: 5px 5px 0 0; } ul li:last-child a { border-radius: 0 0 5p
我有一个这样的表:
或者这些术语用于指代同一事物? 我正在尝试在我的 Win32 应用程序中实现一些显示位图图像的自定义按钮。一个教程指出我应该使用 CreateWindow() 创建子窗口。 但是,我已经从另一个关于创
我想在 jquery 中获取我的 svg 的 id,我尝试了这个 jquery,但它是未定义的。 $(event.target).children('svg').attr("id") Target.e
我是一名优秀的程序员,十分优秀!