Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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);
}
Ejemplo n.º 5
0
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;
}
Ejemplo n.º 6
0
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;
}