[Perl 6] Search Binary-Tree node

前端之家收集整理的这篇文章主要介绍了[Perl 6] Search Binary-Tree node前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

About

  • binarytree

  • depth first search

Code

假设有一二叉树,给出AB两个点,求AB的最短路径。
代码只是一个演示,可以寻找到达两个节点的路径

role BinaryTree[::Type] {
has Type $.node;
has BinaryTree[Type] $.lchild;
has BinaryTree[Type] $.rchild;

method create(::?CLASS::U: *@list) {
    my $middle      = @list.elems div 2;
    my @lchilds     = @list[0 .. $middle - 1];
    my $midchild    = @list[$middle];
    my @rchilds     = @list[$middle + 1 .. * - 1];

    self.bless(
        node    => $midchild,lchild  => @lchilds ?? self.create(@lchilds) !! $?CLASS,rchild  => @rchilds ?? self.create(@rchilds) !! $?CLASS,);
}

method preorder(&callback) {
    callback $!node;
    for $!rchild,$!lchild -> $child {
        $child.preorder(&callback) if $child.defined;
    }
}

}

`(

4
3       2
1 6     5 8

)
my $tree = BinaryTree[Int].create(1,3,6,4,5,2,8);
my $a = 5; # 要寻找的a的值
my $b = 8; # 要寻找的b的值
my $ab; # 是否找到a
my $bb; # 是否找到b
my @adistance; # 路径记录
my @bdistance; # 路径记录
my $print = -> \array { for array { print " " ~ .node; }; say ""; };

sub dinstance-search($tree){
return if ?$ab && ?$bb;
if $tree.rchild.defined {
@adistance.push: $tree unless ?$ab;
@bdistance.push: $tree unless ?$bb;
dinstance-search($tree.rchild);
}
if $tree.lchild.defined {
@adistance.push: $tree unless ?$ab;
@bdistance.push: $tree unless ?$bb;
dinstance-search($tree.lchild);
}
{

say "access tree node: " ~ $tree.node;

    #$print(@adistance);
    if !?$ab {
        if $a eq $tree.node {
            $ab = True;
            return;
        }
        @adistance.pop;
    }
    if !?$bb {
        if $b eq $tree.node {
            $bb = True;
            return;
        }
        @bdistance.pop;
    }
}

}

dinstance-search($tree);

say "a ---> ";
$print(@adistance);

say "b ---> ";
$print(@bdistance);

猜你在找的Perl相关文章