繁体   English   中英

如何迅速让所有父母获得一棵树上的所有叶子?

[英]How to get all parents for all leaves in a tree quickly?

我有一个可能很大的根树结构,我想将其转换为X * Y矩阵,其中X是树中的叶子数量, Y是树中大于1的节点数量,即根节点和内部节点。 矩阵应这样填充:

M i,j = {如果叶i具有祖先j ,则为0 ,否则为1

例如,这棵树:

      --A 
     /
    1   B
   / \ /
  /   3  
 /     \
0       C
 \ 
  \   --D
   \ /
    2
     \--E

将转换为以下矩阵:

  0 1 2 3
A T T F F
B T T F T
C T T F T
D T F T F
E T F T F

由于树可能变得很大(可能有约100,000个叶子),我想知道是否有比遍历每个叶子节点的树更聪明/更快的方法。 感觉某种算法正在某个地方解决此问题,但我还没有弄清楚。 也许有人可以帮忙?

在我的应用程序中,树表示较大的系统发育层次 ,因此不平衡,可能有两个以上子节点的节点。

我会进行订单遍历。

在遍历树时维护叶子列表,在每个级别上-列表将包含该级别之前的所有叶子。

我们将使用的功能的比例降低:

list merge(list1,list2) //merges two lists and creates a new list
list create() // creates a new empty list
void add(list,e) // appends e to the list
void setParent(leaf,node) //sets (in your matrix) node as a parent of leaf

伪代码:

list Traverse(root):
  if (root == nil):
      l <- create()
      return l
  else if (root is leaf):
      l <- create()
      add(l,root)
      return l
  else: 
      l1 <- Traverse(root.left)
      l2 <- Traverse(root.right)
      l <- merge(l1,l2)
      for each leaf in l:
          setParent(leaf,root)
      return l

时间为O(n*m) -用于设置矩阵(尽管对于平衡树,算法本身为O(nlogn)时间)。

如果要防止O(n*m)初始化,可以O(1)初始化矩阵 ,然后在O(nlogn)运行上述算法。 尽管它将提供更好的渐近复杂度,但我怀疑它实际上会更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM