protected void rebalance(BSTNode<T> node){
		int balance = Math.abs(calculateBalance(node));
		if (balance > 1){
			if (calculateBalance((BSTNode<T>)node) >0
				&& calculateBalance((BSTNode<T>)node.getLeft()) >= 0){
				rightRotation(node); 
			}
			else if (calculateBalance((BSTNode<T>)node) < 0 
				&& calculateBalance((BSTNode<T>) node.getRight())<=0)
				{
				leftRotation(node);
			}
			else if (calculateBalance((BSTNode<T>)node) > 0
				&& calculateBalance((BSTNode<T>) node.getLeft())< 0){
				leftRotation((BSTNode<T>)node.getLeft());
				rightRotation(node);
			}
			else if (calculateBalance((BSTNode<T>) node) < 0
	                 && calculateBalance((BSTNode<T>) node.getRight()) > 0){
				rightRotation((BSTNode<T>)node.getRight());
				leftRotation(node);
			}
		}	
	}