问题描述
我是Perl的新手。我第一次看它是在几天前,并决定练习实现一些算法和数据结构以进行学习。在这种情况下为二叉搜索树(BST)。
当前,我使用的是Node包“ Node.pm”,BinarySearchTree包“ BST.pm”和用于使用代码“ Main.pl”的入口点。
我的问题是在使用对根属性的引用时插入树的根节点时出现的(我知道它只是哈希表中的一个键=>值,但是使用传统的OOP术语,我喜欢将其称为属性)。
这里是上下文的构造函数:
BST.pm
sub new() {
my $type = shift;
my $this = {};
my $list = shift;
$this->{'unordered_list'} = $list;
$this->{'root'} = undef;
bless($this,$type);
return $this;
}
构造函数从整数列表中构造一个二进制搜索树,直到第一次调用“插入”时,根节点才被定义。
在对“ BuildUnbalancedTree”的调用中,我传递了对“ root”属性的引用:
Main.pl
$bst = BST->new($nums);
$bst->BuildUnbalancedTree(\$bst->{'root'});
$bst->TraverseInOrder($bst->{'root'});
BST.pm
sub BuildUnbalancedTree(){
my $this = shift;
my $root = shift;
foreach my $key (@{$this->{'unordered_list'}}){
my $newnode = $this->NewNode($key);
$this->Insert($$root,$newnode);
}
}
在“插入”方法中,如果我尝试使用传递给它的变量插入根节点,则除了根节点之外,树的一部分已构建。子节点都已设置,但根节点本身的值从未设置。
这是我希望可以使用的方法,但不可行:
sub Insert(){
my $this = shift;
my $root = shift;
my $node = shift;
if(!$root) {
$root = $node;
} elsif($node->{'value'} > $root->{'value'}) {
if(!$root->{'right'}) {
$root->{'right'} = $node;
} else {
$this->Insert($root->{'right'},$node);
}
} else {
if(!$root->{'left'}){
$root->{'left'} = $node;
} else {
$this->Insert($root->{'left'},$node)
}
}
}
假设第一个条件仅在首次调用“ Insert”时成立,所以我更改了这一行:
$root = $node;
至:
$this->{'root'} = $node;
它确实有效,但是我真的很想知道为什么其他方法不够用。我相信这是因为我在调用“ BuildUnbalancedTree”时不引用根参数(如果不这样做,它会破坏所有内容),但我非常感谢您确认并可能进行一些简短的专家分析。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)