perl - 如何通过 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
解决方案
推荐阅读
- ios - iOS 上的数据共享
- java - 单击按钮时,JavaFX 在新线程上运行任务
- c - 传递给 C 中的函数之前和之后的 sizeof(array) 之间的差异
- python - 尝试下载较大的压缩 csv 文件时 Python 代码中断,在较小的文件上工作正常
- excel - 不可能的 Excel-VBA 电子邮件循环
- java - 在使用 Maven 编译的胖 jar 中时出现 Apache POI ClasDefNotFoundException
- service-worker - 重试失败的动态导入?(SPA/PWA)
- javascript - 在对象数组中过滤数组
- javascript - 带类别的分组柱形图中的向下钻取
- c# - 如何将方法中显示的字符串调用到另一个类中?