遍历从上到下有两个以上子节点的树,以获取java中的值,然后自下而上遍历以再次调整值

时间:2017-03-29 12:35:33

标签: java mongodb spring-boot spring-data-mongodb tree-traversal

我有一棵树,可以有两个以上的孩子,所以它不是二叉树。事实上它可以有n不。孩子们也可以有n级。

如果我从根(具有id)开始,那么孩子们将根的id作为父ID,并且孩子们也有自己的id。同样,如果我转到下一级别,则上级节点id将作为此级别的父ID。 我怎么需要遍历? 从根节点开始,根据根节点id我将找到子节点(将根节点id作为父节点id)然后我需要从这些子节点检索一些数据并进行一些计算。移动到下一个级别,当我通过这些孩子id然后再做一些计算时,我会找到它。这个过程一直持续到我没有找到任何基于ID的记录。 此外,我还需要反向遍历以进行一些推论。

我正在使用spring boot和mongodb。使用spring数据mongodb。

实体结构 -ID - 父亲的身份 - 类型 - 金额 - 供应商ID。

我需要一个解决方案来遍历这种树并检索数据。 这也是一项性能关键任务。

1 个答案:

答案 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); 
}