[英]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.