有一个树形结构,例如:
1
/ \
/ \
2 3
| / \
| / \
4 5 6
节点(叶子)的集合,必须在子树中,例如:
[5, 6]
如何找到包含所有这些节点并以根元素开始的最小子树?就像这样:
1
\
\
3
/ \
/ \
5 6
基本上,你可以递归到叶子节点,并找出每个叶子节点是否需要。当递归再次回到上层时,你可以看到任何后代是否被需要。
以下是伪代码示例:
def mark_needed_nodes(node, given_nodes):
# If a leaf, check if it is in given_nodes
if node is leaf:
node.needed = node in given_nodes
return node.needed
# It is not a leaf; check if any of the descendants is needed.
node.needed = False
for child in node.children:
node.needed = needed or mark_needed_nodes(child, given_nodes)
return node.needed
mark_needed_nodes(root, given_nodes)
函数。given_nodes
是基于哈希表的字典,其复杂度与树中节点数量成线性关系。