void BinarySearchTree::checkIfUnbalanced(Node *TopNode, int left, int right) { int balance_factor = left - right; // Left Case if(balance_factor >= LEFT_HEAVY) balanceTree(TopNode, LINKED_LEFT); // Right Case if(balance_factor <= RIGHT_HEAVY) balanceTree(TopNode, LINKED_RIGHT); }
NodeT* deleteNode(struct Node *root, int data){ if(root == NULL) return root; // Search for the key if(data < root->data) root->left = deleteNode(root->left, data); else if(data > root->data) root->right = deleteNode(root->right, data); // Once found, delete it else{ // One child or no child if ((root->left == NULL) || (root->right == NULL)){ NodeT* tempNode; if(root->left == NULL && root->right != NULL) tempNode = root->right; else tempNode = root->left; if(tempNode == NULL){ tempNode = root; root = NULL; } else *root = *tempNode; free(tempNode); } // Two children else{ NodeT* tempNode = minValueNode(root->right); root->data = tempNode->data; root->right = deleteNode(root->right, tempNode->data); } } return balanceTree(root); }
void insertTree(tree *t, char *name, char *pass) { node* nod = NULL; node* next = NULL; node* last = NULL; if(t->root == NULL) { nod = createNode(); nod->username=strdup(name); nod->password=strdup(pass); t->root = nod; }else { next = t->root; while(next != NULL) { last = next; if(strcmp(next->username,name)>0) next = next->left; else next = next->right; } nod = createNode(); nod->username = strdup(name); nod->password = strdup(pass); if(strcmp(last->username,name)>0) last->left = nod; if(strcmp(last->username,name)<0) last->right= nod; } balanceTree(t); }
NodeT* insertNodeUtil(struct Node* root, int data){ if(root == NULL){ root = createNode(data); } else{ if(data < root->data) root->left = insertNodeUtil(root->left, data); else root->right = insertNodeUtil(root->right, data); } return balanceTree(root); }
void medTree::addElement(myLL* &node,int num,bool &leftOfHead) { myLL* node2add = new myLL; node2add->value = num; node2add->left = NULL; node2add->right = NULL; node2add->parent = NULL; if (node != NULL) { if (node2add->value <= node->value) { if (node == head) leftOfHead = true; if (node->left == NULL) { node2add->parent = node; node->left = new myLL; node->left->value = num; node->left->left = NULL; node->left->parent = node; node->left->right = NULL; if (leftOfHead) m_leftCt++; else m_rightCt++; if (balanceTree(head)) { if (leftOfHead) { m_rightCt++; m_leftCt--; } else { m_leftCt++; m_rightCt--; } } } else { addElement(node->left,node2add->value,leftOfHead); } } else { if (node == head) leftOfHead = false; if (node->right == NULL) { node2add->parent = node; node->right = new myLL; node->right->value = num; node->right->left = NULL; node->right->parent = node; node->right->right = NULL; if (leftOfHead) m_leftCt++; else m_rightCt++; if (balanceTree(head)) { if (leftOfHead) { m_rightCt++; m_leftCt--; } else { m_leftCt++; m_rightCt--; } } } else { addElement(node->right,node2add->value,leftOfHead); } } } delete node2add; }
int avlTree::addElem2AVL(avlStruct* node,int data2add,bool isleftOfHead) { avlStruct* node2add = new avlStruct; node2add->data = data2add; node2add->left = NULL; node2add->right = NULL; node2add->parent = NULL; if (node == NULL) { //empty tree... node = node2add; m_head = node; } else { if (node2add->data <= node->data) { if (node == m_head) isleftOfHead = true; if (node->left == NULL) {//this is where to add the node. node2add->parent = node; node->left = node2add; if (isleftOfHead) m_leftHt++; else m_rightHt++; if (balanceTree(m_head)) { if (isleftOfHead) m_leftHt--; else m_rightHt--; } } else { this->addElem2AVL(node->left,node2add->data,isleftOfHead); } } else { if (node == m_head) isleftOfHead = false; if (node->right == NULL) { //add somewhere in right subtree. node2add->parent = node; node->right = node2add; if (isleftOfHead) m_leftHt++; else m_rightHt++; if (balanceTree(m_head)) { if (isleftOfHead) m_leftHt--; else m_rightHt--; } } else { this->addElem2AVL(node->right,node2add->data,isleftOfHead); } } } delete node2add; return 1; }