平衡二叉树操作的演示
BSTNode*p1,*p2;
if(p->bf==0)//原本左右子树等高,现因左子树增高而使树增高
{p->bf=1;
taller=1;
}
else if(p->bf==-1)//原本右子树比左子树高,现左右子树等高
{p->bf=0;
taller=0;
}
else//原本左子树比右子树高,须作左子树的平衡处理
return0;
if(taller==1)//已插入到*b的左子树中且左子树长高
Le(b,taller);
}
else//继续在*b的右子树中进行搜索
{if((InsertAVL(b->rchild,e,taller))==0)//未插入
return0;
if(taller==1)//已插入到*b的右子树中且右子树长高
平衡二叉树操作的演示
———————————————————————————————— 作者:
———————————————————————————————— 日期:
#include<stdio.h>
#include<malloc.h>
typedef int KeyType;//定义关键字类型
typedef structnode//记录类型
{p2=p1->lchild;
p1->lchild=p2->rchild;
p2->rchild=p1;
p->rchild=p2->lchild;
p2->lchild=p;
if(p2->bf==0)//新结点插在*p2处作为叶子结点的情况
ﻩ p->bf=p1->bf=0;
elseif(p2->bf==-1)//新结点插在*p2的右子树上的情况
{p1=p->rchild;//p指向*p的右子树根结点
if(p1->bf==-1)//新结点插入在*p的右孩子的左子树上,要做RR调整
{p->rchild=p1->lchild;
p1->lchild=p;
p->bf=p1->bf=0;
p=p1;
}
elseif(p1->bf==1)//新结点插入在*p的右孩子的左子树上,要做RL调整
{p2=p1->rchild;
p1->rchild=p2->lchild;
p2->lchild=p1;
p->lchild=p2->rchild;
p2->rchild=p;
if(p2->bf==0)//新结点插入在*p2处作为叶子结点的情况
ﻩp->bf=p1->bf=0;
elseif(p2->bf==1)//新结点插在*p2的左子树上的情况
{//若在平衡二叉排序树b中不存在和e有相同关键字的结点,则插入一个数据元素为e的新结点,
//并返回1,否则返回0。若因插入而使二叉排序树失去平衡,则作平衡旋转处理,布尔变量taller
//反映b长高与否
if(b==NULL)//原树为空,插入新结点,树长高,置taller为1
{b=(BSTNode*)malloc(sizeof(BSTNode));
{p1=p->lchild;//p指向*p的左子树根节点
if(p1->bf==1)//新结点插入在*p的左孩子的左子树上,要做LL调整
{p->lchild=p1->rchild;
p1->rchild=p;
p->bf=p1->bf=0;
p=p1;
}
else if(p1->bf==-1)//新结点插入在*p的左孩子的右子树上,要做LR调整
{KeyTypekey;//关键字项
int bf;//平衡因子
structnode *lchild,*rchild;//左右孩子指针
}BSTNode;
voidLe(BSTNode *&p,int&taller)
{//对以指针p所指结点为根的二叉树作左平衡旋转处理,本算法结束时,
//指针p指向新的根结点
b->key=e;
b->lchild=b->rchild=NULL;
b->bf=0;
taller=1;
}
else
{if(e==b->key)//树中已存在和e有相同关键字的结点则不插入
{taller=0;
return 0;
}
if(e<b->key)//继续在*b的左子树中进行搜索
{if((InsertAVL(b->lchild,e,taller))==0)//未插入
if(p->bf==1)
{p->bf=0;
taller=1;
//指针p指向新的根结点
BSTNode*p1,*p2;
if(p->bf==0)//原本左右子树等高,现因右子树增高而使树增高
{p->bf=-1;
taller=1;
}
else if(p->bf==1)//原本左子树比右子树高,现左右子树等高
{p->bf=0;
taller=0;
}
else//原本右子树比左子树高,须作右子树的平衡处理
RightProcess(b,taller);
}
}
return1;
}
void DispBSTree(BSTNode *b)
{//以括号表示法输出AVL
if(b!=NULL)
{printf("%d",b->key);
if(b->lchild!=NULL||b->rchild!=NULL)
{printf("(");
DispBSTree(b->lchild);
if(b->rchild!=NULL)printf(",");
DispBSTree(b->rchild);
printf(")");
}
}
}
void Le(BSTNode*&p,int&taller)//在删除结点时进行左处理
{BSTNode *p1,*p2;
{p1->bf=0;
p->bf=1;
}
else//新结点插在*的左子树上的情况
{p1->bf=-1;
p->bf=0;
}
p=p2;
p->bf=0;//仍将p指向新的结点,并置其bf值为0
}
taller=0;
}
}
int InsertAVL(BSTNode*&b,KeyType e,int&taller)
{p1->bf=0;
p->bf=-1;
}
else//新结点插在*p2的右子树上的情况
{p1->bf=1;
p->bf=0;
}
p=p2;
p->bf=0;//仍将p指向新的根结点,并置其bf值为0
}
taller=0;
}
}
voidRightProcess(BSTNode *&p,int &taller)
{//对以指针p所指结点为根的二叉树作右平衡旋转处理,本算法结束时,