bool AVLinsert(nodeTree *&root, nodeTree *node, bool &taller) { bool ret = 1; if (root == NULL) { root = node; taller = true; return 1; } else if (node->key == root->key) { taller = false; ret = 0; } else if (node->key < root->key) { ret = AVLinsert(root->pLeft, node, taller); if (taller == true) { switch (root->balance) { case -1: AVLleftBalance(root, taller); taller = false; break; case 0: root->balance = -1; break; case 1: root->balance = 0; taller = false; break; } } } else { ret = AVLinsert(root->pRight, node, taller); if (taller == true) switch (root->balance) { case -1: root->balance = 0; taller = false; break; case 0: root->balance = 1; break; case 1: AVLrightBalance(root, taller); taller = false; break; } } return ret; }
void AVLinsert (BST &T,records R,int &unblanced) { if(!T) { unblanced=1; T=new node; T->data=R; T->lchild=T->rchild=NULL; T->bf=0; } else if(R.key<T->data.key) { AVLinsert(T->lchild,R,unblanced); if(unblanced) switch(T->bf) { case -1:T->bf=0; unblanced=0; break; case 0:T->bf=1; break; case 1:LeftRotation(T,unblanced); default:break; } } else if(R.key>T->data.key) { AVLinsert(T->rchild,R,unblanced); if(unblanced) switch(T->bf) { case -1: RightRotation(T,unblanced); break; case 0:T->bf=-1; break; case 1: T->bf=0; unblanced=0; break; default:break; } } else unblanced=0; }
bool addNode(nodeTree *node) { if (!isAVL) { return BSTinsert(myTree->root, node); } else { bool taller; return AVLinsert(myTree->root, node, taller); } }
BST CreatBST() { BST T=NULL; keytype key; scanf("%d",&key); records R; R.key=key; while(key) { R.key=key; AVLinsert(T,R,unblanced); scanf("%d",&key); } return T; }