当前位置:文档之家› 实现平衡二叉排序树的各种算法代码 一

实现平衡二叉排序树的各种算法代码 一

实现平衡二叉排序树的各种算法代码一/* 《实现平衡二叉排序树的各种算法》一、分析题目要求用函数实现如下平衡二叉排序树算法,:(1)插入新结点(2)前序、中序、后序遍历二叉树(递归)(3)前序、中序、后序遍历的非递归算法(4)层次遍历二叉树(5)在二叉树中查找给定关键字(函数返回值为成功1,失败0)(6)交换各结点的左右子树(7)求二叉树的深度(8)叶子结点数(9)删除某结点为了完成以上的各项操作,首先应该用函数建一棵平衡二叉排序树,输入形式是首先输入要建的二叉树的结点数,然后依次输入各个结点的值。

在实现插入新结点的函数时,需要一个向一棵二叉树插入新结点的函数。

可用递归算法写出平衡二叉树的前序,中序,后序遍历的函数。

在写平衡二叉树的前,中,后序遍历的非递归算法时要用到栈结构的知识,运用栈结构来存储平衡二叉树结点的指针。

在层次遍历二叉树时需要用到队列结构,运用队列结构的先进先出来存储二叉树的结点指针。

在遍历二叉树的结点时需要一个访问结点数据的函数。

二叉树是一棵排序树,所以二叉树的查找可以运用其有序的性质,查找的方式和建树的方式相似。

交换二叉树各结点的左右子树时,可以用先序遍历递归的方式从根结点向下递归,每次访问结点时就需将各结点的左右孩子的指针调换,并对该结点的平衡因子作相应的处理。

示二叉树的深度时,可用递归的方式访问结点的左右子树,并记录下左右子树的深度,最后返回左右子树中较深的深度的值即可。

可以用一次遍历的方式遍历二叉树,记录每一个经过的结点,若结点存在且左右孩子都为空,则该结点为叶子结点。

删除二叉树的某个结点时,首先要写一个函数,用递归查找的方式找到相应的结点,该函数还要有调整二叉树平衡的作用,因为若删除结点使得二叉树深度减少而不平衡,需要调整二叉树的平衡,若该结点不存在则返回ERROR,,若存在该结点,则应该再写一个函数来删除该结点,在删除之前还要判断该结点是只有左子树还是只有右子树还是左右子树都有的情况:若只有左或是只有右子树,则只需删除该结点,并回溯调整二叉树的平衡;若该结点的左右子树都有,则应该用另一个函数递归找到该结点的直接“后继”,并从该“后继”开始回溯调整二叉树的平衡。

*/#include<stdio.h>#include<stdlib.h>#include<malloc.h>#define OK 1#define ERROR 0#define EH 0#define RH -1#define EQ(a,b) ((a)==(b))#define LT(a,b) ((a)<(b))#define LQ(a,b) ((a)<=(b))#define STACK_INIT_SIZE 100 // 栈#define STACKINCREMENT 10 // 栈#define MAXQSIZE 100 //队列#define ElemType int#define Status int#define TRUE 1#define FALSE 0#define Boolean bool//-----------------------------------------结构体typedef struct BSTNode//平衡二叉树结构{ElemType data;int bf;struct BSTNode *lchild,*rchild;}BSTNode,*BSTree;typedef BSTree SElemType; //栈typedef BSTree QElemType; //队列typedef struct //队列的结构体{QElemType *base;int front;int rear;}SqQueue;typedef struct SqStack //栈的结构体{SElemType *base;SElemType *top;}SqStack;//-------------------------------------函数列表//队列Status InitQueue(SqQueue &Q); //初始化队列Status EnQueue(SqQueue &Q,QElemType e); //进队列Status DeQueue(SqQueue &Q,QElemType &e); //出队列Status GetHead(SqQueue Q,QElemType &e); //获队列首int QueueLength(SqQueue Q); //队列长度Status QueueTraverse(SqQueue Q); //遍历队列//栈Status InitStack(SqStack &S); //初始化栈Status Push(SqStack &S,SElemType e); //进栈Status Pop(SqStack &S,SElemType &e); //出栈Status GetTop(SqStack S,SElemType &e); //获栈顶int StackLength(SqStack S); //栈的长度Status StackEmpty(SqStack S); //判栈空Status StackTraverse(SqStack S); //栈的遍历//平衡二叉树void R_Rotate(BSTree &p); //右旇void L_Rotate(BSTree &p); //左旇Status InsertAVL(BSTree &T,ElemType e,Boolean &taller);//平衡二叉树结点插void LeftBalance(BSTree &T); //左平衡void RigthBalance(BSTree &T); //右平衡Status CreateBST(BSTree &T,int n); //建树Status Visit(ElemType e); //访问Status PreOrderTraverse(BSTree T); //前序遍历Status InOrderTraverse(BSTree T); //中序遍历Status PostOrderTraverse(BSTree T); //后序遍历Status preOrderIter(BSTree T); //前序非递归遍历Status inOrderIter(BSTree T); //中序非递归遍历Status postOrderIter(BSTree T); //后序非递归遍历Status FindBST(BSTree T,ElemType key,int &n);//在二叉树中查找关键词Status OverTraverse(BSTree &T); //层次遍历Status OverChang(BSTree &T); //交换左右子树int BSTDeep(BSTree T); //求树的深度Status Sum(BSTree T,int &n); //求叶子结点数Status DeleteBST(BSTree &T,int key,bool &taller);//删除结点Status Delete(BSTree &p,bool &taller);Status Delete2(BSTree &p,bool taller,ElemType &f);void MU(); //选择菜单//-------------------------------------//-------------------------------------初始化队列{Q.base=(QElemType*)malloc(MAXQSIZE*sizeof(QElemType)); if(!Q.base)return ERROR;Q.front=Q.rear=0;return OK;}//-------------------------------------进队列Status EnQueue(SqQueue &Q,QElemType e){if((Q.rear+1)%MAXQSIZE==Q.front)return ERROR;Q.base[Q.rear]=e;Q.rear=(Q.rear+1)%MAXQSIZE;return OK;}//-------------------------------------出队列Status DeQueue(SqQueue &Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];Q.front=(Q.front+1)%MAXQSIZE;return OK;}//-------------------------------------获队列首Status GetHead(SqQueue Q,QElemType &e){if(Q.front==Q.rear)return ERROR;e=Q.base[Q.front];return OK;}//-------------------------------------队列长度int QueueLength(SqQueue Q){return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE;}//-------------------------------------遍历队列{int i;i=Q.front;if(Q.front==Q.rear)printf("The Queue is Empty!");else{printf("The Queue is:");while(i!=Q.rear){printf("% d",Q.base[i]);i=i+1;}}printf("\n");return OK;}//-------------------------------------//-------------------------------------初始化栈Status InitStack(SqStack &S){S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));if(!S.base)return ERROR;S.top=S.base;S.stacksize=STACK_INIT_SIZE;return OK;}//-------------------------------------进栈Status Push(SqStack &S,SElemType e){if(S.top-S.base>=S.stacksize){S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType)); if(S.base)return ERROR;S.top=S.base+S.stacksize;S.stacksize+=STACKINCREMENT;}*S.top++=e;return OK;}//-------------------------------------出栈Status Pop(SqStack &S,SElemType &e){if(S.top==S.base)return ERROR;e=*--S.top;return OK;}//-------------------------------------获栈顶Status GetTop(SqStack S,SElemType &e){if(S.top==S.base)return ERROR;e=*(S.top-1);return OK;}//-------------------------------------栈的长度int StackLength(SqStack S){int i=0;while(S.top!=S.base){i++;S.top--;}return i;}//-------------------------------------判栈空Status StackEmpty(SqStack S){if(S.top==S.base) return 1;else return 0;}//-------------------------------------栈的遍历Status StackTraverse(SqStack S){SElemType *p=(SElemType*)malloc(sizeof(SElemType)); p=S.top;if(S.top==S.base)printf("The Stack is Empty!");else{printf("The Stack is:");p--;S.base--;while(p!=S.base){printf("% d",*p);p--;}}printf("\n");return OK;}//-----------------------------------------------------------------//-----------------------------------------------------------------右旇void R_Rotate(BSTree &p){BSTree lc;lc=p->lchild;p->lchild=lc->rchild;lc->rchild=p;p=lc;}//-----------------------------------------------------------------左旇void L_Rotate(BSTree &p){BSTree rc;rc=p->rchild;p->rchild=rc->lchild;rc->lchild=p;p=rc;}//-----------------------------------------------------------------平衡二叉树结点插入Status InsertAVL(BSTree &T,ElemType e,Boolean &taller){if(!T){T=(BSTree)malloc(sizeof(BSTNode));T->data=e;T->lchild=T->rchild=NULL;T->bf=EH;taller=TRUE;}elseif(EQ(e,T->data)) {taller=FALSE;return 0;}//已经有结点了if(LT(e,T->data)){if(!InsertAVL(T->lchild,e,taller)) return 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:RigthBalance(T);taller=FALSE;break;}}}return 1;//-----------------------------------------------------------------左平衡void LeftBalance(BSTree &T){BSTree c,rd;c=T->lchild;switch(c->bf){case LH:T->bf=c->bf=EH;R_Rotate(T);break;case RH:rd=c->rchild;switch(rd->bf){case LH:T->bf=RH; c->bf=EH;break;case EH:T->bf=c->bf=EH; break;case RH:T->bf=EH;c->bf=LH;break;}rd->bf=EH;L_Rotate(T->lchild);R_Rotate(T);}}//-----------------------------------------------------------------右平衡void RigthBalance(BSTree &T){BSTree rd,lc;rd=T->rchild;switch(rd->bf){case RH:T->bf=rd->bf=EH;L_Rotate(T);break;case LH:lc=rd->lchild;switch(lc->bf){case RH:T->bf=LH;rd->bf=EH;break;case EH:T->bf=rd->bf=EH;break;case LH:T->bf=EH;rd->bf=RH;break;}lc->bf=EH;R_Rotate(T->rchild);L_Rotate(T);}}//-----------------------------------------------------------------建树Status CreateBST(BSTree &T,int n){T=NULL;bool taller=FALSE;int k,i;for(i=1;i<=n;i++){scanf("%d",&k);InsertAVL(T,k,taller);}return OK;}//-----------------------------------------------------------------访问Status Visit(ElemType e){printf("%d ",e);return OK;}//-----------------------------------------------------------------前序遍历Status PreOrderTraverse(BSTree T){if(T){if(Visit(T->data))if(PreOrderTraverse(T->lchild))if(PreOrderTraverse(T->rchild))return OK;return ERROR;}elsereturn OK;}//-----------------------------------------------------------------前序非递归遍历Status preOrderIter(BSTree T){BSTree p,q;p=T;SqStack S;if (T == NULL) return ERROR;InitStack(S);Push(S,p);while (!StackEmpty(S)){GetTop(S,p);Visit(p->data);Pop(S,p);if (p->rchild != NULL)Push(S,p->rchild);if (p->lchild != NULL)Push(S,p->lchild);}printf("\n");return OK;}//-----------------------------------------------------------------中序遍历Status InOrderTraverse(BSTree T){if(T){if(InOrderTraverse(T->lchild))if(Visit(T->data))if(InOrderTraverse(T->rchild))return OK;return ERROR;}elsereturn OK;}//-----------------------------------------------------------------中序非递归遍历Status inOrderIter(BSTree T){BSTree p;p=T;SqStack S;if (T == NULL) return ERROR;InitStack(S);while (p!= NULL || !StackEmpty(S)){if (p!= NULL){Push(S,p);p=p->lchild;}else{GetTop(S,p);Visit(p->data);Pop(S,p);p=p->rchild;}}printf("\n");return OK;}//-----------------------------------------------------------------后序遍历Status PostOrderTraverse(BSTree T){if(T){if(PostOrderTraverse(T->lchild))if(PostOrderTraverse(T->rchild))if(Visit(T->data))return OK;return ERROR;}elsereturn OK;}//-----------------------------------------------------------------后序非递归遍历Status postOrderIter(BSTree T){if (!T) return 0;BSTree p,q;p=T;SqStack S1,S2;InitStack(S1);InitStack(S2);Push(S1,p);while (!StackEmpty(S1)){GetTop(S1,q);Push(S2,q);Pop(S1,p);if (q->lchild)Push(S1,q->lchild);if (q->rchild)Push(S1,q->rchild);}while (!StackEmpty(S2)){GetTop(S2,q);Visit(q->data);Pop(S2,q);}printf("\n");return OK;}//-----------------------------------------------------------------在二叉树中查找关键词Status FindBST(BSTree T,ElemType key,int &n){if(!T) return ERROR;if(EQ(key,T->data)) {n=1;return OK;}else if(LT(key,T->data)){FindBST( T->lchild, key,n);}else FindBST( T->rchild,key,n);return OK;}//-----------------------------------------------------------------层次遍历Status OverTraverse(BSTree &T){BSTree p;SqQueue Q;if(!InitQueue(Q)) return ERROR;p=T;if(!T) return ERROR;EnQueue(Q,p);while(QueueLength(Q)){DeQueue(Q,p);Visit(p->data);if(p->lchild) EnQueue(Q,p->lchild);if(p->rchild) EnQueue(Q,p->rchild);}return OK;}//-----------------------------------------------------------------交换左右子树Status OverChang(BSTree &T){BSTree q;if(T){q=T->lchild;T->lchild=T->rchild;T->rchild=q;switch(T->bf){case LH:T->bf=RH;break;case EH:break;case RH:T->bf=LH;break;}if(OverChang(T->lchild))if(OverChang(T->rchild))return OK;return ERROR;}elsereturn OK;}//-----------------------------------------------------------------求树的深度int BSTDeep(BSTree T){int ln=0,rn=0,n=0;if(T){ln=(BSTDeep(T->lchild));rn=(BSTDeep(T->rchild));n=ln>rn?ln:rn;n++;return n;}elsereturn 0;}//-----------------------------------------------------------------求叶子结点数Status Sum(BSTree T,int &n){if(T){ if((T->lchild==NULL)&&(T->rchild==NULL)) n++;if(Sum(T->lchild,n))if(Sum(T->rchild,n))return OK;return ERROR;}elsereturn OK;}//-----------------------------------------------------------------删除结点Status DeleteBST(BSTree &T,int key,bool &taller) {if(!T) return FALSE;else{if(EQ(key,T->data)){Delete(T,taller);}else if(LT(key,T->data)){if(!DeleteBST(T->lchild,key,taller)) return 0;if(taller)switch(T->bf){case LH:T->bf=EH;taller=FALSE;break;case EH:T->bf=RH;taller=FALSE;break;case RH:RigthBalance(T);taller=FALSE;break;}}else{if(!DeleteBST(T->rchild,key,taller)) return 0;if(taller)switch(T->bf){case LH:LeftBalance(T);taller=TRUE;break;case EH:T->bf=LH;taller=FALSE;break;case RH:T->bf=EH;taller=FALSE;break;}}}return OK;}//----------------------------------------------------------------- Status Delete(BSTree &p,bool &taller){BSTree q,s;ElemType f;if(!p->rchild){q=p;p=p->lchild;taller=true;free(q);}else if(!p->lchild){q=p;p=p->rchild;taller=true;free(q);}else{q=p;s=p->lchild;if(!s->rchild){p->lchild=s->lchild;free(s);taller=TRUE;}else{Delete2(p,taller,f);p->data=f;}}return OK;}//----------------------------------------------------------------- Status Delete2(BSTree &p,bool taller,ElemType &f) {BSTree q;q=p->rchild;if(q->rchild){if(!Delete2(p->rchild,taller,f)) return 0;if(taller)switch(p->bf){case LH:LeftBalance(p);taller=TRUE;break;case EH:p->bf=LH;taller=FALSE;break;case RH:p->bf=EH;taller=FALSE;break;}}else{p->rchild=q->lchild;f=q->data;taller=TRUE;free(q);}return OK;}//-----------------------------------------------------------------选择菜单void MU(){printf("===================================================\n"); printf("1 建一棵新的二叉树\n");printf("2 插入新的结点\n");printf("3 前,中,后序遍历二叉树\n");printf("4 前序、中序、后序遍历的非递归算法\n");printf("5 层次遍历二叉树\n");printf("6 在二叉树中查找给定关键字(函数返回值为成功1,失败0)\n"); printf("7 交换各结点的左右子树\n");printf("8 求二叉树的深度\n");printf("9 叶子结点数\n");printf("10 删除某结点\n");printf("===================================================\n"); printf("请选择:");}//-----------------------------------------------------------------主函数int main(){BSTree T=NULL;bool taller=FALSE;int n,k,i;while(true){MU();scanf("%d",&n);switch(n){case 1:scanf("%d",&k);if(CreateBST(T,k)) printf("建树成功!\n");else printf("建树失败!\n");break;case 2:printf("请输入要插入的数字:");scanf("%d",&k);if(InsertAVL(T,k,taller)) printf("%d 插入成功!\n",k); else printf("二叉树中已经存在%d\n",k); break;case 3:PreOrderTraverse( T); printf("\n"); InOrderTraverse( T); printf("\n"); PostOrderTraverse( T); printf("\n");break;case 4:preOrderIter( T);inOrderIter( T);postOrderIter( T);break;case 5:OverTraverse(T);printf("\n");break;case 6:scanf("%d",&k);i=0;FindBST( T, k,i);printf("%d\n",i);break;case 7:if(OverChang(T)) printf("操作成功!\n");else printf("操作失败!\n");break;case 8:k=BSTDeep( T);printf("二叉树的深度是%d!\n", k);break;case 9:k=0;Sum( T,k);printf("叶子的结点数为%d\n",k);break;case 10:scanf("%d",&k);if(DeleteBST(T, k,taller)) printf("操作成功!\n"); else printf("二叉树中不存在%d!\n",k); break;default:printf("输入不正确,请重新输入!\n");}}return 0;}。

相关主题