Jeff 'Japhy' Pinyan wrote:
>
> >my %tree = { package1 => [ package2, package3, package4 ],
> >              package2 => [ package7 ],
> >              package3 => [ package5 ],
> >              package4 => [ package7, package6],
> >              package5 => [ ],
> >              package6 => [ ],
> >              package7 => [ ] };
>
> You have curly braces { ... } where you want parentheses ( ... ).
>
> >Now, I want to walk the tree starting with a known "package1" and build an
> >ordered list of packages to install. For example:
> >
> >package7
> >package2
> >package5
> >package3
> >(no package7 here because it is already in the list)
> >package6
> >package4
> >package1
>
> This sounds like postorder tree traversal to me:
>
>   // pseudocode
>   postorder (tree) {
>     if tree is null: return
>     for node in tree.nodes: postorder(node)
>     print tree
>   }
>
> With your hash, in perl, this would look like:
>
>   postorder(\%tree, 'package1');
>
>   sub postorder {
>     my ($tree, $pkg, $seen) = @_;
>     return if $seen->{$pkg}++;  # to stop from traversing a node twice
>
>     postorder($tree, $_, $seen) for @{ $tree->{$pkg} };
>     print "$pkg\n";
>   }
>
> This gives the expected output.

Hi Jeff.

But in the general caase there's a problem with finding the root of the tree.
Indeed there may be several independent trees or none at all if the
relationships are cyclic.

Rob




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to