平衡二叉树的完整实现

来源:互联网 发布:喝水 知乎 编辑:程序博客网 时间:2024/05/20 13:13

      平衡二叉树的实现算法并不难,无非4种旋转外加平衡因子的调整,但是, 要是实现起来,还是有些麻烦。下面是我实现的一个版本,欢迎大家提意见。

    

#include <iostream>using namespace std;typedef struct node{int bf;//平衡因子int key;//数据struct node *leftChild, *rightChild; //左孩子,右孩子指针}BBSTNode; //balanced binary search tree nodeconst int LH = 1; // 左子树高于右子树const int RH = -1; //右子树高于左子树const int EH = 0;//左右子树等高//针对LL型的树结构做右旋void RightRotate(BBSTNode *& p){BBSTNode * lc;//points to the left child of the rootlc = p->leftChild;p->leftChild = lc->rightChild;lc->rightChild = p;p = lc; //change the root pointer}//针对RR型的树结构做左旋void LeftRotate(BBSTNode *& p){BBSTNode * rc;rc = p->rightChild;p->rightChild = rc->leftChild;rc->leftChild = p;p = rc; }//左子树因长高而失衡void LeftBalance(BBSTNode *& root){BBSTNode * lc; //根的左子树lc = root->leftChild;switch(lc->bf){case LH:lc->bf = root->bf = EH;//修改根和左子树的平衡因子RightRotate(root);break;case RH:BBSTNode * rd; //根的左子树的右子树rd = lc->rightChild;switch(rd->bf){case LH:lc->bf = EH, root->bf = RH;break;case EH:lc->bf = root->bf = EH;break;case RH:root->bf = EH, lc->bf = LH;break;}rd->bf = EH;LeftRotate(root->leftChild);RightRotate(root);break;}}//右子树因长高而失衡void RightBalance(BBSTNode *& root){BBSTNode * rc; //根的右子树rc = root->rightChild;switch(rc->bf){case RH:root->bf = EH, rc->bf = EH;LeftRotate(root);break;case LH:BBSTNode * ld;ld = rc->leftChild;switch(ld->bf){case LH:root->bf = EH, rc->bf = RH;break;case EH:root->bf = rc->bf = EH;break;case RH:root->bf = LH, rc->bf = EH;break;}ld->bf = EH;RightRotate(root->rightChild);LeftRotate(root);break;}}//递归插入数据int insertAVL(BBSTNode * & root, int key, bool & taller){if(!root) //根节点为空则插入之{root = new BBSTNode();root->key = key;root->leftChild = root->rightChild = NULL;root->bf = EH;taller = true;}else{if(key == root->key){taller = false;return 0;}else if(key < root->key){if(!insertAVL(root->leftChild, key, taller)){return 0;}if(taller){switch(root->bf){case LH:LeftBalance(root);taller = false;break;case EH:root->bf = LH;taller = true;break;case RH:root->bf = EH;taller = false;break;}}}else{if(!insertAVL(root->rightChild, key, taller)){return 0;}if(taller){switch(root->bf){case LH:root->bf = EH;taller = false;break;case EH:root->bf = RH;taller = true;break;case RH:RightBalance(root);taller = false;break;}}}}}//中序遍历平衡二叉树void in(BBSTNode * root){if(root){in(root->leftChild);cout << root->key << '\t';in(root->rightChild);}}int main(){BBSTNode * root; //平衡二叉树的根指针root = NULL; //跟指针初始化int key;bool taller;//建树,没输入一个结点,则输出中序遍历序while(cin >> key){insertAVL(root, key, taller);in(root);cout << endl;}return 0;}