protected static <E extends Comparable<E>> Node<E> glueTree (Node<E> lN, Node<E> rN, int lH, int rH, Node<E> lMax) {
		assert !(lN.color == RED && rN.color == RED) : "!(lN.color == RED && rN.color == RED)";
		
		if (lN == null) {
			return rN;
		}
		else if (rN == null) {
			return lN;
		}
		else if (lH == rH) {
			assert lN.color == BLACK && rN.color == BLACK : "only glue two equal-height BLACK nodes";
			
			return new Node<E>(lMax, lN, rN);
		}
		else if (lH > rH) {
			lN.right = glueTree(lN.right, rN, lH-1, rH, lMax);
			lN = fixUp(lN);
			return lN;
		}
		else {
			if (rN.left.color == RED) {
				rN.left = glueTree(lN, rN.left, lH, rH, lMax);
				rN = fixUp(rN);
			}
			else {
				rN.left = glueTree(lN, rN.left, lH, rH-1, lMax);
			}
			return rN;
		}
	}