对二叉排序树查找效率进行分析,就要看其平均查找长度,由于相同n个结点的二叉排序树是不唯一的,例如:
上面两个二叉排序树的结点是相同的,但是树的形状不同,这样查找元素的时候,效率也不同,若看平均查找效率,必然是第一个图中的效率高。因此有了平衡二叉树。
平衡二叉树(Balanced Binary Tree)又称为AVL树,它或者是一棵空树,或者是具有下列性质的二叉树:它的左子树和右子树都是平衡二叉树,且左子树和右子树的深度之差的绝对值不超过1。若将二叉树上结点的平衡因子BF(Balance Factor)定义为该结点的左子树的深度减去它的右子树的深度,则平衡二叉树上所有结点的平衡因子只可能是-1,0,+1。
贴上平衡二叉树的代码实现。
/*****************************平衡二叉树建立,查找,插入,删除操作******************************/
//by vipper.zhang 2011.7.12 如果有什么问题或者可以改进的建议,请发邮件vipper.zhang@gmail.com
//O(∩_∩)0
#include <iostream>
using namespace std;
typedef int KeyType;
const int LH=1;
const int EH=0;
const int RH=-1;
//二叉链表存储二叉查找树结点
typedef struct BSTNode{
KeyType key;
int bf;
BSTNode *lchild,*rchild;
}*BSTree;
/// 函数声明 ///
void R_Rotate(BSTree &p); //对以*p为根的二叉排序树作右旋处理
void L_Rotate(BSTree &p); //对以*p为根的二叉排序树作左旋处理
void LeftBalance(BSTree &T); //对以指针T所指结点为根的二叉树作左平衡旋转处理
void RightBalance(BSTree &T);//对以指针T所指结点为根的二叉树作右平衡旋转处理
bool InsertAVL(BSTree &T,int e,bool &taller);//插入结点e
bool SearchBST(BSTree &T,int key);//查找元素key是否在树T中
void PrintBST(BSTree T,int m);//按树状打印输出二叉树的元素
void CreateBST(BSTree &T); //创建平衡二叉树,(注意:以输入-1为二叉树建立的结束)
void LeftBalance_div(BSTree &p,int &shorter);//删除结点时左平衡旋转处理
void RightBalance_div(BSTree &p,int &shorter);//删除结点时右平衡旋转处理
void Delete(BSTree q,BSTree &r,int &shorter);//删除结点
int DeleteAVL(BSTree &p,int x,int &shorter);//平衡二叉树的删除操作
/
int main()
{
int m; //控制输出树时的层次
int input; //操作选项
int search; //要查找的元素||要插入 的元素||要删除的元素
bool taller=false; //是否插入成功
int shorter=0; //是否删除成功
BSTree T=new BSTNode;
T=NULL;
while(1)
{
system("cls");
cout<<" ********************************************"<<endl;
cout<<" ╱◥██◣ *1.创建\t2.