public static <E extends Comparable<E>> CQueue<E> concatenate (CQueue<E> qLeft, CQueue<E> qRight) {
		
		//step 0, handle corner cases
		//Here, the implication is that empty tree's minNode and maxNode will be ignored
		if (qLeft == null || qLeft.height == -1) {
			return qRight;
		}
		else if (qRight == null || qRight.height == -1) {
			return qLeft;
		}
		
		//first, concatenate the leafs
		qLeft.maxNode.right = qRight.minNode;
		qRight.minNode.left = qLeft.maxNode;
		
		//second, concatenate the two trees
		int newHeight = Math.max(qLeft.height, qRight.height);
		Node<E> newRoot = glueTree(qLeft.root, qRight.root, qLeft.height, qRight.height, qLeft.maxNode);
		if (newRoot.color == RED) {
			newRoot.color = BLACK;
			newHeight++;
		}
		
		return new CQueue<E> (newRoot, newHeight, qLeft.minNode, qRight.maxNode);
	}