public override FTree <T> App2(List <T> ts, FTree <T> rightFT) { if (!(rightFT is DeepFTree <T>)) { FTree <T> resultFT = this; foreach (T t in ts) { resultFT = resultFT.Push_Back(t); } return((rightFT is EmptyFTree <T>) ? resultFT : resultFT.Push_Back(rightFT.LeftView().head)); } else // the right tree is also a deep tree { DeepFTree <T> deepRight = rightFT as DeepFTree <T>; List <T> cmbList = new List <T>(backDig.digNodes); cmbList.AddRange(ts); cmbList.AddRange(deepRight.frontDig.digNodes); FTree <T> resultFT = new DeepFTree <T> (frontDig, innerFT.App2(FTree <T> .ListOfNodes(cmbList), deepRight.innerFT), deepRight.backDig ); return(resultFT); } }
public static FTree <T> CreateR(Digit <T> frontDig, FTree <Node <T> > innerFT, List <T> backList //may be empty! ) { if (backList.Count > 0) { return(new DeepFTree <T>(frontDig, innerFT, new Digit <T>(backList) )); } //else if (innerFT is EmptyFTree <Node <T> > ) { return(FromSequence(frontDig.digNodes)); } //else we must create a new intermediate tree var innerRight = innerFT.RightView(); List <T> newlstBack = innerRight.last.theNodes; DeepFTree <T> theNewDeepTree = new DeepFTree <T>(frontDig, innerRight.ftInit, new Digit <T>(newlstBack) ); return(theNewDeepTree); }
public static FTree <T> Create(List <T> frontList, //may be empty! FTree <Node <T> > innerFT, Digit <T> backDig ) { if (frontList.Count > 0) { return(new DeepFTree <T>(new Digit <T>(frontList), innerFT, backDig )); } //else if (innerFT is EmptyFTree <Node <T> > ) { return(FromSequence(backDig.digNodes)); } //else we must create a new intermediate tree var innerLeft = innerFT.LeftView(); List <T> newlstFront = innerLeft.head.theNodes; DeepFTree <T> theNewDeepTree = new DeepFTree <T>(new Digit <T>(newlstFront), innerLeft.ftTail, backDig ); return(theNewDeepTree); }