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

 #! /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->{ri

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值