C兑现平衡二叉树-AVL
C实现平衡二叉树---AVL
/************************************************************************/ /* C实现平衡二叉树---AVL */ /************************************************************************/ #include <stdio.h> #include <stdlib.h> #define LH (+1) #define EH 0 #define RH (-1) #define TRUE 1 #define FALSE 0 typedef int ElemType; typedef struct BiTNode { ElemType data; int bf;//balance flag struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void R_Rotate(BiTree* p) { BiTree lc = (*p)->lchild; (*p)->lchild = lc->rchild; lc->rchild = *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,rd; lc = (*T)->lchild; switch (lc->bf) { case LH: { (*T)->bf = lc->bf = EH; R_Rotate(T); break; } case RH: { rd = lc->rchild; switch(rd->bf) { case LH: { (*T)->bf = RH; lc->bf = EH; break; } case EH: { (*T)->bf = lc->bf = EH; break; } case RH: { (*T)->bf = EH; lc->bf = LH; break; } } } rd->bf = EH; L_Rotate(&(*T)->lchild); R_Rotate(T); break; } } void RightBalance(BiTree* T) { BiTree lc,rd; lc= (*T)->rchild; switch (lc->bf) { case RH: { (*T)->bf = lc->bf = EH; L_Rotate(T); break; } case LH: { rd = lc->lchild; switch(rd->bf) { case LH: { (*T)->bf = EH; lc->bf = RH; break; } case EH: { (*T)->bf = lc->bf = EH; break; } case RH: { (*T)->bf = EH; lc->bf = LH; break; } } } rd->bf = EH; R_Rotate(&(*T)->rchild); L_Rotate(T); break; } } int InsertAVL(BiTree* T,ElemType e,int* taller) { if ((*T)==NULL) { *T=(BiTree)malloc(sizeof(BiTNode)); (*T)->bf = EH; (*T)->data = e; (*T)->lchild = NULL; (*T)->rchild = NULL; *taller=TRUE; } else if (e == (*T)->data) { *taller = FALSE; return 0; } else if (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: { RightBalance(T); *taller = FALSE; break; } } } } return 1; } int FindNode(BiTree root,ElemType e,BiTree* pos) { BiTree pt = root; (*pos) = NULL; while(pt) { if (pt->data == e) { //找到节点,pos指向该节点并返回true (*pos) = pt; return TRUE; } else { if (pt->data>e) { pt = pt->lchild; } else { pt = pt->rchild; } } } return FALSE; } void InorderTra(BiTree root) { if(root->lchild) { InorderTra(root->lchild); } printf("%d ",root->data); if(root->rchild) { InorderTra(root->rchild); } } int main() { int i,nArr[] = {1,23,45,43,38,95,23,42,55}; BiTree root=NULL,pos; int taller; for (i=0;i<9;i++) { InsertAVL(&root,nArr[i],&taller); } InorderTra(root); if(FindNode(root,95,&pos)) { printf("\n%d\n",pos->data); } else { printf("\nNot find this Node\n"); } return 0; }