input:
1
2
x
x
3a
4
3b
output:
1
2
3a
4
3b
to-include(node):
// returns true or false on some condition
returns true
node structure
node:
string name
node[] children
Keep a nearest ancestor pointer (initially null) and add current node to its children.
filteredTree = filter-tree(tree, null)
filter-tree(node, ancestor):
if to-include(node):
nodeCopy = new node(node.name)
if ancestor != null:
ancestor.children.add(nodeCopy)
ancestor = nodeCopy
foreach child in node.children:
childAncestor = filter-tree(child, ancestor)
if ancestor == null:
ancestor = childAncestor
return ancestor
The root node itself could be skipped, so the very first filtered node becomes root of filtered tree. There are cases where the hierarchy is not maintained.
input:
x
x
3a
4
3b
output:
3a
4
3b
input:
x
x
1
x
2
output:
1
2
Another way is have a placeholder ancestor initially but the output tree will be different.
(node):
nplaceholder = new
(node, nplaceholder)
return nplaceholder.children
(node, ancestor):
if to-include(node):
ancestor.children.add(node)
ancestor = node
for child in node.children:
(child, ancestor)
No comments:
Post a Comment