perl 实现二叉树,二叉平衡树

这段Perl代码展示了如何创建并操作一个AVL树,包括插入节点、删除节点以及平衡调整。代码中定义了旋转操作如左旋、右旋以及双旋,还包含了插入节点的函数和树的删除操作。通过Dumper函数输出树的状态来展示操作结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 #! /usr/bin/perl -w
use strict;
use warnings;
use Data::Dumper;

my $head = undef;
my $copy = /$head;

foreach my $index( 1 .. 10 ){
  &AVLTree_insert($copy, $index);
}
#&create_BSTree( $copy );
#&create_tree( $copy );
print Dumper ( $head );
&tree_delete( $copy, 1 );

print Dumper ( $head );
#&afterward_travel($head);
#&middle_travel($head);
#&layer_travel ( $head );
#&search_BST( $head, 23);

sub max{
    my ( $a, $b) = @_;
    return $a > $b ? $a : $b;
}
sub ll_rotate {
    my $root = shift;
    my $x = $$root;
    my $y = $x->{left};
    $x->{left} = $y->{right};
    $y->{right} = $x;
    $$root = $x;
    $x->{height} = &max( &height( $x->{left} ), &height( $x->{right} ) ) + 1;
    $y->{height} = &max( &height( $y->{left} ), &height( $y->{right} )) + 1;
}

sub rr_rotate {
    my $root = shift;
    my $x = $$root;
    my $y = $x->{right};
    $x->{right} = $y->{left};
    $y->{left} = $x;
    $$root = $y;
    $x->{height} = &max( &height( $x->{left} ), &height( $x->{right} ) ) + 1;
    $y->{height} = &max( &height( $y->{left} ), &height( $y->{right} ) ) + 1;
}
sub lr_rotate {
    my $root = shift;
    my $x = $$root;
    my $y = $x->{left};
    &rr_rotate( /$x->{left});
    &ll_rotate ( $root);
}

sub rl_rotate {
    my $root = shift;
    my $x = $$root;
    my $y = $x->{right};
    &ll_rotate( /$x->{right});
    &rr_rotate( $root);
}

sub AVLTree_insert{
    my ( $tree, $value ) = @_;
    if  ( !defined $$tree ){
        $$tree = {
                    height => 0,
                    left   => undef,
                    right  => undef,
                    value  => $value,
                 }
    }
    else {
        if ( $$tree->{value} > $value ){
           &AVLTree_insert( /$$tree->{left}, $value);
           if ( (&height( $$tree->{left} ) - &height( $$tree->{right}) ) == 2 ){
               if ($value < $$tree->{left}->{value}){
                   &ll_rotate( $tree );
               }
               else {
                   &lr_rotate( $tree );
               }
           }
        }
        else{
           &AVLTree_insert( /$$tree->{right}, $value);
           if ( ( &height( $$tree->{right} ) - &height( $$tree->{left} )) == 2){
               if ( $value > $$tree->{right}->{value}){
                 &nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值