@Override
	public void add(T t) {
		LockFreeNode<T> newNode=new LockFreeNode<T>(t,false);//new leaf
		SearchReturnValues ret;

		while(true){
			ret=search(newNode);
			if(newNode.compareTo(ret.l)==0)
				return;
			if(!ret.si.isClean()){
				Help(ret.si);
			}else{
				T key=(newNode.compareTo(ret.l)<0)?ret.l.value:newNode.value;
				LockFreeNode<T> nl=new LockFreeNode<T>(ret.l.value,false);//new leaf
				LockFreeNode<T> ni=new LockFreeNode<T>(key);//new internal
				ni.left.set((newNode.compareTo(nl)<0)?newNode:nl, 0);
				ni.right.set((newNode.compareTo(nl)<0)?nl:newNode,0);
				boolean ris;

				IInfo<T> op= new IInfo<T>(ni,ret.p,ret.l,ret.stamps);
				StateInfo<T> newStateInfo = new StateInfo<T>(StateInfo.IFlag,op);
				ris=ret.p.si.compareAndSet(ret.si, newStateInfo, op.stamps.siStamp, ++op.stamps.siStamp);
				if(ris){
					HelpInsert(op);
					return;
				}else{
					Help(ret.p.si.getReference());
				}
			}
		}	
	}