как вывести в древовидную структуру через Tree :: DAG_Node? - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь написать программу, которая может читать из файла, затем помещать в сортировку кучи, а затем выводить в дереве вместе с отсортированным списком.Но я застрял, вместо того, чтобы пут был числами, используемыми в сортировке кучи, он просто размещал 1-10 на одной строке, а затем 1-9 на следующей.Я действительно запутался и едва понимаю этот язык как есть.Ниже приведен пример из приведенного ниже с результатами, которые я надеюсь получить.

#!/usr/bin/perl
use 5.006;
use strict;
use warnings;
use Tree::DAG_Node;


process_data(read_file('testing.txt'));
process_data((3,1,4,1,5,9,2,6,5,3,6));

sub read_file{
    my($filename)=@_;
    my @data=();
    my @words;
    open(my $fh, "<", $filename)
        or die "Could not open file: $!\n";
    while(<$fh>){
    chomp;
    @words = split(' ');
    foreach my $word(@words){
    push @data, $word;
}

}
close $fh;

return @data;
}


sub heap_sort {
    my ($a) = @_;
    my $n = @$a;
    for (my $i = ($n - 2) / 2; $i >= 0; $i--) {
        down_heap($a, $n, $i);
    }
    for (my $i = 0; $i < $n; $i++) {
        my $t = $a->[$n - $i - 1];
        $a->[$n - $i - 1] = $a->[0];
        $a->[0] = $t;
        down_heap($a, $n - $i - 1, 0);
    }
}

sub down_heap {
    my ($a, $n, $i) = @_;
    while (1) {
        my $j = max($a, $n, $i, 2 * $i + 1, 2 * $i + 2);
        last if $j == $i;
        my $t = $a->[$i];
        $a->[$i] = $a->[$j];
        $a->[$j] = $t;
        $i = $j;
    }


sub max {
    my ($a, $n, $i, $j, $k) = @_;
    my $m = $i;
    $m = $j if $j < $n && $a->[$j] > $a->[$m];
    $m = $k if $k < $n && $a->[$k] > $a->[$m];
    return $m;
}
}

sub draw_tree{
    my(@data)=@_;
    my $root = Tree::DAG_Node->new;
$root->name($_[0]);
$root->new_daughter->name($_) for (1..10);
my @names = @data;
my $count = 50;
for my $n ($root->daughters) {
    for (split //, $names[$count++]) {
        $n->new_daughter->name($_)
    }
}
print map "$_\n", @{$root->draw_ascii_tree};
}

sub process_data{
    my(@data)=@_;
    my @a = @data;
    print "@a\n";
    print "\n";
    heap_sort(\@a);
    draw_tree(@a);
    print "\n";
    print "@a\n";
    print "\n";

}

вот вывод, который я получаю Вывод CMD моего кода

Вывод, который я ожидаю: (используя пример данных)

1 19 4 5

   1
   |
 1 ----- 9
 |      
 /\ 
4 5

1 1 4 5 9

...