为什么需要显式引用属性才能修改它,而不是使用引用?

问题描述

我是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 (将#修改为@)