二叉树的插入,删除,查找,平衡等操作。
关于二叉树的平衡那里,代码是正确的可以运行,但我现在已经看不懂了。。不得不说代码写成这样,可读性实在是个问题。
基本照抄严蔚敏数据结构
#include <iostream>
#include <stdlib.h>
#define LH 1
#define EH 0
#define RH -1
using namespace std;
//结构体
typedef struct BiTree{
int data;
int bf;
struct BiTree *lchild,*rchild;
}BiTree;
//查找算法
BiTree* SearchBST(BiTree *T,int key){
if((T == NULL) || key == T->data){
return T;
}else if(key < T->data){
return SearchBST(T->lchild,key);
}else{
return SearchBST(T->rchild,key);
}
}
//查找二叉排序树,并返回是否查找成功
bool SearchBST(BiTree *T,int key,BiTree *f,BiTree *&p){
//cout <<"search="<<key<<endl;
if(!T){
p=f;//p指向访问过的最后一个节点 //f指向双亲,初始为NULL
return false;
}else if(key == T->data){
p=T;
return true;
}else if(key < T->data){
return SearchBST(T->lchild,key,T,p);
}else{
return SearchBST(T->rchild,key,T,p);
}
}
//当不存在元素时,执行插入
bool InsertDST(BiTree *&T,int e){
cout <<"插入"<<e<<endl;
BiTree *p = NULL;
if(!SearchBST(T,e,NULL,p)){//有节点时都返回双亲。没有节点时,没有输入返回NULL,有输入返回T也是NULL,所以都一样
BiTree *s = new BiTree;
s->data = e;
s->lchild = NULL;
s->rchild = NULL;
if(!p){
T = s;
}else if(e < p->data){
p->lchild = s;
}else{
p->rchild = s;
}
return true;
}else{
return false;
}
}
//删除操作
bool Delete(BiTree *&p){
cout <<"删除"<<p->data<<endl;
if(!p->rchild){
BiTree *q = p ;
p = p->lchild;
free(q);
}else if (!p->lchild){
BiTree *q = p ;
p = p->rchild;
free(q);
}else{
BiTree *q = p;
BiTree *s = p->lchild;
while(s->rchild){
q = s;
s = s->rchild;
}
p->data = s->data;
if(q != p ){
q->rchild = s->lchild;
}else{
q->lchild = s->lchild;
}
delete s;
}
return true;
}
//删除二叉树中的元素
bool DeleteBST(BiTree *&T,int key){
if(!T){
return false;
}else{
if (key == T->data){
return Delete(T);
}else if(key < (T->data)){
return DeleteBST(T->lchild,key);
}else{
return DeleteBST(T->rchild,key);
}
}
}
//中序遍历二叉树的递归算法
void print(BiTree *T){
if(T){
cout <<"中序遍历"<<T->data<<endl;
print(T->lchild);
print(T->rchild);
}
}
void R_Rotate(BiTree *&p){
BiTree *lc = p->lchild;
p->lchild = lc->rchild;
lc->lchild = p;
p = lc;//返回根
}
void L_Rotate(BiTree *&p){
BiTree *rc = p->rchild;
p->rchild = rc->lchild;
rc->lchild = p;
p = rc;
}
void LeftBalance(BiTree *&T){
BiTree *lc = T->lchild;
switch (lc->bf){
case LH://左边高,单右旋处理
T->bf = EH;//平衡因子处理
lc->bf = EH;
R_Rotate(T);
break;
case RH://左高的双向旋转处理
BiTree *rd = lc->rchild;
switch(rd->bf){
case LH:
T->bf = RH;
lc->bf = EH;
break;
case EH:
T->bf = EH;
lc->bf = EH;
break;
case RH:
T->bf = EH;
lc->bf = LH;
}
rd->bf = EH;
L_Rotate(T->lchild);
R_Rotate(T);
}
}
void RightBalance(BiTree *&T){
BiTree *lc = T->rchild;
switch (lc->bf){
case RH:
T->bf = EH;
lc->bf = EH;
L_Rotate(T);
break;
case LH:
BiTree *rd = lc->lchild;
switch(rd->bf){
case LH:
T->bf = EH;
lc->bf = RH;
break;
case EH:
T->bf = EH;
lc->bf = EH;
break;
case RH:
T->bf = LH;
lc->bf = EH;
}
rd->bf = EH;
L_Rotate(T->lchild);
R_Rotate(T);
}
}
//成功插入返回1,否则0.tanller指示是否插入。
int InsertAVL(BiTree *&T,int e,bool &taller){
if(!T){
T = new BiTree;
T->data = e;
T->lchild = NULL;
T->rchild = NULL;
T->bf = EH;
taller = true;
}else{
if(e == T->data){
taller = false;
return 0;
}
if(e < T->data){
if(!InsertAVL(T->lchild,e,taller)) return 0;//递归,失败返回0
if(taller){
switch (T->bf){
case LH:
LeftBalance(T);
taller = false;
break;
case EH:
T->bf = LH;
taller = true;
break;
case RH:
T->bf = EH;
taller = false;
break;
}
}
}else{
if(!InsertAVL(T->rchild,e,taller)) return 0;
if(taller){
switch (T->bf){
case LH:
T->bf = EH;
taller = false;
break;
case EH:
T->bf = RH;
taller = true;
break;
case RH:
RightBalance(T);
taller = false;
break;
}
}
}
}
return 1;//成功返回1
}
int main(){
int arr[]={45,12,53,3,37,100,24,61,90,78};
BiTree *T = NULL;
int length = sizeof(arr)/sizeof(arr[0]);
cout <<"length="<<length<<endl;
for(int i = 0 ;i < length;i++){
InsertDST(T,arr[i]);
}
print(T);
DeleteBST(T,100);
print(T);
return 0;
}