AVL树的模板类实现

一、介绍

       在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为1,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下的时间复杂度都是O(logn)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G. M. Adelson-Velsky和E. M. Landis,他们在1962年的论文《An algorithm for the organization of information》中发表了它。

   节点的平衡因子是它的左子树的高度减去它的右子树的高度(有时相反)。带有平衡因子1、0或 -1的节点被认为是平衡的。带有平衡因子 -2或2的节点被认为是不平衡的,并需要重新平衡这个树。平衡因子可以直接存储在每个节点中,或从可能存储在节点中的子树高度计算出来。

二、AVL树的C++实现

2.1 树节点

template <class T>
struct BSTNode{
	T data;
	int h;
	BSTNode<T> * lchild, * rchild;
};

2.2 类声明

template <class T>
class AVLTree{
	public:
		AVLTree():root(NULL){}
		~AVLTree(){Release(root);}
		bool Insert(T x){return Insert(root,x);}
		bool Delete(T x){Delete(root,x);}
		bool Search(T &x){return !(Search(root,x)==NULL);}
		bool Modify(const T &x);
		void PreOrder(void visit(const T &x)){PreOrder(root,visit);}
		void InOrder(void visit(const T &x)){InOrder(root,visit);}
		
	private:
		BSTNode<T> * root;
		void Release(BSTNode<T> * bst);
		inline int Height(BSTNode<T> * bst){return (bst==NULL?-1:bst->h);}
		void SingleRotateWithLeft(BSTNode<T> * &bst);	//LL型 
		void DoubleRotateWithLeft(BSTNode<T> * &bst);	//LR型
		void SingleRotateWithRight(BSTNode<T> * &bst);	//RR型
		void DoubleRotateWithRight(BSTNode<T> * &bst);	//RL型 
		bool Insert(BSTNode<T> * &bst, const T &x);
		bool Delete(BSTNode<T> * &bst, const T &x);
		BSTNode<T> * Search(BSTNode<T> * bst, T &x);
		void PreOrder(BSTNode<T> * bst, void visit(const T& x));
		void InOrder(BSTNode<T> * bst, void visit(const T& x));
};

2.3 插入操作

        AVL树在算法设计上与普通二叉排序树的最大区别在于AVL树在插入和删除后必须进行重平衡操作。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值