AVL树实现与分析

本文介绍了AVL树的基本概念,包括其高度平衡的性质和平衡因子定义。讨论了AVL树的效率,指出在含有N个节点的AVL树中,操作时间复杂度为log2n。文章重点讲解了AVL树的插入操作可能导致平衡因子变化,从而需要通过旋转操作(左单旋、右单旋、左右双旋)来维护平衡,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

一、背景知识

AVL树是高度平的二叉搜索树,它能降低二叉树的高度,减少树的平均搜索长度.

二、AVL树的性质

1、左子树和右子树的高度差的绝对值不超过1

2、树中的每个左子树和右子树都是AVL树

3、每个节点都有一个平衡因子(balance factor--bf),任一节点的平衡因子都为-1,0,1。(每个节点的平衡因子等于右子树的高度减去左子树的高度)

三、AVL的效率

  一棵AVL树有N个节点,高度可以保持在log2n,插入/删除/查找的时间复杂度也是log2n.

(注:log2n表示log以2为底n的对数。)

四、AVL的实现(代码及分析)

  AVL树(K/V)的结点

template<class K,class T>
struct AVLTreeNode
{
	K _key;     //搜索的关键字
	T _value;   //数值
	int _bf;    //平衡因子
	AVLTreeNode<K, T>* _left;
	AVLTreeNode<K, T>* _right;
	AVLTreeNode<K, T>* _parent;
	AVLTreeNode(const K& key, const T& value)
		:_key(key)
		, _value(value)
		, _bf(0)
		, _left(NULL)
		, _right(NULL)
		, _parent(NULL)
	{}
};
AVL树的旋转

当增加一个元素,如果破坏了-1,0,1这样的平衡因子的时候,就需要通过旋转来修改平衡因子。


代码实现(左单旋转)

void RotateL(Node* parent)
	{
		Node* subR = parent->_right;
		Node* subRL = subR->_left; 

		parent->_right = subRL;
		if (subRL) //判断
			subRL->_parent = parent;

		subR->_left = parent;
		Node* ppNode = parent->_parent;
		parent->_parent = subR;
		if (ppNode == NULL)
		{
			_root = subR;
			subR->_parent = NULL;
		}
		else
		{
			if (ppNode->
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值