AVL

template <typename Comparable>
struct AvlNode
{
	Comparable element;
	AvlNode *left;
	AvlNode *right;
	int height;
	
	AvlNode( const Comparable & theElement,
						AvlNode *lt, AvlNode *rt, int = 0 )
						:element(theElement),left(lt),right(rt),
							height(h)
							{	}
}

int height( AvlNode *t )const
{
	return t == NULL ? -1 : t->height;
}

void insert( const Comparable & x, AvlNode * & t )
{
	if( t == NULL )
		{
			t =new AvlNode( x, NULL, NULL );
		}
		else if( x < t->element )
			{
				insert( x, t->left );
				if( height( t->left ) - height( t->right ) == 2 )
					if( x < t->left->element )
						rotateWithLeftChild( t );
						else
							doubleWithLeftChild( t );
			}
			else if( t->element < x )
				{
					insert( x, t->right );
					if( height( t->right ) - height( t->left ) == 2 )
							if( t->right->element < x )
								rotateWithRightChild( t );
								else
									doubleWithRightChild( t );
				}
				else return;
	
}

void rotateWithLeftChild( AvlNode * &k2 )
{
	AvlNode *k1 = k2->left;
	k2->left = k1->right;
	k1->right = k2;
	k2->height = max( height( k2->left ),height( k2->right ) ) + 1;
	k1->height = max( height( k1->left ),k2->height ) + 1;
	k2 = k1;
}
void rotateWithrightChilf( AvlNode * & k1)
{
	AvlNode *k2 = k1->right;
	k2 ->left =k1;
	k1->right = k2->left;
	k1 = k2;	
}

void doubleWithLeftChild( AvlNode * & k3 )
{
	rotateWithChild( k3->left );
	rotateWithLeftChild( k3 );
}
void doubleWithRightChild( k3->left )
{
	rotateWithRightChild( k3->left );
	rotateWithLeftChild( k3 );
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值