首页 > 解决方案 > 如何通过 Tree::DAG_Node 输出到树状结构?

问题描述

我正在尝试编写一个程序,该程序可以从文件中读取,然后放入堆排序中,然后与排序列表一起输出到树中。但是我被卡住了,而不是让 put 是堆排序中使用的数字,它只是在一行上发布 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 1 9 4 5

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

1 1 4 5 9

标签: perltreeviewoutputheapsort

解决方案


推荐阅读