我有一棵树,可以有两个以上的孩子,所以它不是二叉树。事实上它可以有n不。孩子们也可以有n级。
如果我从根(具有id)开始,那么孩子们将根的id作为父ID,并且孩子们也有自己的id。同样,如果我转到下一级别,则上级节点id将作为此级别的父ID。 我怎么需要遍历? 从根节点开始,根据根节点id我将找到子节点(将根节点id作为父节点id)然后我需要从这些子节点检索一些数据并进行一些计算。移动到下一个级别,当我通过这些孩子id然后再做一些计算时,我会找到它。这个过程一直持续到我没有找到任何基于ID的记录。 此外,我还需要反向遍历以进行一些推论。
我正在使用spring boot和mongodb。使用spring数据mongodb。
实体结构 -ID - 父亲的身份 - 类型 - 金额 - 供应商ID。
我需要一个解决方案来遍历这种树并检索数据。 这也是一项性能关键任务。
答案 0 :(得分:1)
如果我是你,我会将children
字段添加到structure
因此,遍历树将只是Depth-fisrt search。递归实现将是:
private static final int NOT_FOUND = -1;
public int findItem(someCondition) {
if (check(someCondition)) {
return id;
}
for(Structure child:current.getChildes()) {
int childResult = child.findItem(someCondition);
if (childResult != NOT_FOUND) {
return childResult;
}
}
// this node and its childes are not comply with someCondition
return NOT_FOUND;
}
Depth-fisrt搜索可以迭代的方式编写。
此方法将在O(N)中完成,并且仅访问每个节点 。如果您无法更改结构,则必须访问每个级别的每个节点并花费O(N * n)时间。
如果您想要比O(N)更快地搜索,则需要进行一些排序,例如K-d tree。在以O(log N)时间添加的成本中,您将在O(log N)时间内进行搜索。
构建路径更简单:
Structure current = this;
while (current.getParent() != null) {
current = current.getParent();
path.add(current.id);
}