【问题标题】:Is there an n-ary tree implementation in Perl?Perl 中是否有 n 叉树实现?
【发布时间】:2010-09-07 10:48:04
【问题描述】:

我正在编写一个 Perl 脚本并希望使用 n 叉树数据结构。

是否有作为源代码(而不是 Perl 库的一部分)提供的良好实现?

【问题讨论】:

    标签: perl algorithm tree


    【解决方案1】:

    除了 Matthew 已经说过的内容之外,看起来以下模块是合适的:

    Tree::Nary
    Tree::Simple
    Tree

    【讨论】:

      【解决方案2】:

      我真的不明白为什么您希望它是“源代码”而不是 perl 库,但是您可以下载任何 CPAN 模块的源代码。

      我没用过,但Tree 看起来可以满足你的要求。

      【讨论】:

        【解决方案3】:

        根据您需要树结构的用途,您可能不需要任何预构建的实现。 Perl 已经使用 arrayrefs 的数组来支持它们。

        例如,这棵树的简单表示

                     t
                   /   \
                  a     d
                 / \   / \
                b   c e   f
        

        可以用以下 Perl 代码表示:

        $tree = [ t => [ a => [ b => [], c => [] ]
                         d => [ e => [], f => [] ] ] ];
        

        在这里,树的表示是嵌套的对:首先是元素(在本例中为字母),然后是表示该元素的子元素的匿名数组引用。请注意,=> 只是 Perl 中的一个花哨的逗号,只要它是一个单词,您就不必在逗号左侧的标记周围加上引号。上面的代码也可以这样写:

        $tree = [ 't', [ 'a' , [ 'b' , [], 'c' , [] ]
                         'd' , [ 'e' , [], 'f' , [] ] ] ];
        

        这是树中所有元素的简单深度优先累加器:

        sub elements {
            my $tree = shift;
        
            my @elements;
            my @queue = @$tree;
            while (@queue) {
                my $element  = shift @queue;
                my $children = shift @queue;
                push @elements, $element;
                unshift @queue, @$children;
            }
        
            return @elements;
        }
        
        @elements = elements($tree)     # qw(t a b c d e f)
        

        (广度优先,将unshift @queue, @$children改为push @queue, @$children

        因此,根据您要对树执行的操作,最简单的方法可能就是使用 Perl 对数组和数组引用的内置支持。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-09
          • 1970-01-01
          相关资源
          最近更新 更多