Existe uma implementação de árvore n-ária em Perl?
Pergunta
Estou escrevendo um script Perl e gostaria de usar uma estrutura de dados em árvore n-ária.
Existe uma boa implementação disponível como código-fonte (em vez de parte de uma biblioteca Perl)?
Solução
Adicionando ao que Matthew já disse, parece que os seguintes módulos seriam adequados:
Outras dicas
Eu realmente não entendo por que você quer que seja "fonte" em vez de uma biblioteca Perl, mas você pode baixar a fonte para qualquer módulo CPAN.
Eu não usei, mas Árvore parece preencher suas necessidades.
Dependendo da finalidade de uma estrutura em árvore, talvez você não precise de nenhuma implementação pré-construída.Perl já os suporta usando arrays de arrayrefs.
Por exemplo, uma representação simples desta árvore
t
/ \
a d
/ \ / \
b c e f
pode ser representado pelo seguinte código Perl:
$tree = [ t => [ a => [ b => [], c => [] ]
d => [ e => [], f => [] ] ] ];
Aqui, a representação da árvore é como pares aninhados:primeiro o elemento (neste caso, a letra), depois uma referência de array anônima representando os filhos desse elemento.Observe que =>
é apenas uma vírgula sofisticada em Perl que dispensa a necessidade de colocar aspas ao redor do token à esquerda da vírgula, desde que seja uma única palavra.O código acima também poderia ter sido escrito assim:
$tree = [ 't', [ 'a' , [ 'b' , [], 'c' , [] ]
'd' , [ 'e' , [], 'f' , [] ] ] ];
Aqui está um acumulador simples de profundidade de todos os elementos da árvore:
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)
(Para largura primeiro, altere a linha unshift @queue, @$children
para push @queue, @$children
)
Portanto, dependendo de quais operações você deseja realizar em sua árvore, a coisa mais simples pode ser usar o suporte integrado do Perl para arrays e referências de array.