平衡二叉搜索树
任何结点的左子树和右子树高度最多相差1的二叉搜索树。
(1)AVL树的插入算法
a. 插入结点之后仍然是AVL树,则不调整;
b. 插入结点之后不再满足AVL树条件,则进行调整,根据导致不平衡的原因,分为:
a) LL型――单旋转调整
b) LR型――双旋转调整
c) RL型――双旋转调整
d) RR型――单旋转调整
下图是顺序插入单词{cup,cop,copy,hit,hi,his,hia}后得到的AVL树,单词之间按照字典顺序比较:
(2)AVL树的删除算法
a. 删除过程如BST结点的删除算法
任何结点的左子树和右子树高度最多相差1的二叉搜索树。
(1)AVL树的插入算法
a. 插入结点之后仍然是AVL树,则不调整;
b. 插入结点之后不再满足AVL树条件,则进行调整,根据导致不平衡的原因,分为:
a) LL型――单旋转调整
b) LR型――双旋转调整
c) RL型――双旋转调整
d) RR型――单旋转调整
下图是顺序插入单词{cup,cop,copy,hit,hi,his,hia}后得到的AVL树,单词之间按照字典顺序比较:
(2)AVL树的删除算法
a. 删除过程如BST结点的删除算法
b. 删除后调整――从被删除的结点找到祖父结点,然后开始单旋转或多旋转操作,一次旋转结束并不 意味着树已经平衡,因为这可能会导致它的祖先结点发生新的不平衡。所以这样的调整操作要一直进行下去,直到树平衡为止。
类的实现如下
//平衡二叉搜索树类定义与实现
template<class T> class BSTree;
//平衡二叉搜索树的结点类型定义
template<class T> struct TNode
{private:
TNode<T> *left;//左子树指针
TNode<T> *right;//右子树指针
public:
int balance;//平衡因子
T data;//数据域
friend class BSTree<T>;
//构造函数
TNode():left(NULL),right(NULL),balance(0){ }
TNode(T item,TNode<T> *left1,TNode<T> *right1)
:balance(0),data(item),left(left1),right(right1){ }
};
template<class T> class BSTree
{private:
int size;
public:
//构造函数
BSTree(TNode<T> *&root):size(0){root=NULL;}
//被ClearBST()所调用的函数
void DeleteTree(TNode<T> *&root);
//LL型调整操作
void LL(TNode<T> **a,TNode<T> **b);
//RR型调整操作
void RR(TNode<T> **a,TNode<T> **b);
//LR型调整操作
void LR(TNode<T> **a,TNode<T> **b);
//RL型调整操作
void RL(TNode<T> **a,TNode<T> **b);
//释放空间
void FreeBST(TNode<T> *&root);
//求平衡二叉搜索树中所有结点数
int BSTSize();
//判断平衡二叉搜索树是否为空
int BSTEmpty(TNode<T> *&root);
//取根指针
TNode<T> *GetRoot(TNode<T> *&root);
//从平衡二叉搜索树中查找元素
T