private void DoGetNodesOnDepthIndex(ref IList <MNode <TVal> > list, MNode <TVal> curNode, int curDepthIndex, int targetDepthIndex) { if (curDepthIndex == (targetDepthIndex - 1)) { foreach (MNode <TVal> child in curNode.Children) { list.Add(child); } return; } foreach (MNode <TVal> child in curNode.Children) { this.DoGetNodesOnDepthIndex(ref list, child, curDepthIndex + 1, targetDepthIndex); } }
public IList <MNode <TVal> > GetOffsprings(string valID) { using (this.SmartRWLocker.Lock(AccessMode.Read)) { MNode <TVal> curNode = this.GetNodeByID(valID); if (curNode == null) { return(null); } IList <MNode <TVal> > list = new List <MNode <TVal> >(); this.DoGetOffsprings(curNode, ref list); return(list); } }
public MNode <TVal> EnsureNodeExist(string nodeSequenceCode) { using (base.SmartRWLocker.Lock(AccessMode.Write)) { MNode <TVal> target = base.GetNodeByPath(nodeSequenceCode, this.sequenceCodeSplitter); if (target != null) { return(target); } string[] uppers = nodeSequenceCode.Split(this.sequenceCodeSplitter); if ((uppers[0] != base.Root.TheValue.CurrentID) || (uppers.Length < 2)) { return(null); } return(this.AppendOffSprings(nodeSequenceCode, uppers)); } }
private MNode <TVal> DOAppendOffSprings(MNode <TVal> current, string[] offSpringIDs, int startIndex) { MNode <TVal> temp = current; for (int i = startIndex; i < offSpringIDs.Length; i++) { TVal child = this.agileNodePicker.Retrieve(offSpringIDs[i]); if (child == null) { return(null); } else { temp = temp.AddChild(child); } } return(temp); }
private MNode <TVal> DoGetNode(MNode <TVal> curNode, string ValID) { foreach (MNode <TVal> node in curNode.Children) { if (node.TheValue.CurrentID == (ValID)) { return(node); } } foreach (MNode <TVal> node in curNode.Children) { MNode <TVal> target = this.DoGetNode(node, ValID); if (target != null) { return(target); } } return(null); }
public IList <MNode <TVal> > GetNodesOnDepthIndex(string idPath, char separator, int depthIndex) { using (this.SmartRWLocker.Lock(AccessMode.Read)) { string[] pathAry = idPath.Split(separator); int parentDepthIndex = pathAry.Length - 1; if (parentDepthIndex > depthIndex) { return(null); } MNode <TVal> target = this.GetNodeByPath(idPath, separator); if (target == null) { return(null); } MultiTree <TVal> childTree = new MultiTree <TVal>(); childTree.Initialize(target); return(childTree.GetNodesOnDepthIndex(depthIndex - parentDepthIndex)); } }
/// <summary> /// Initialize 使用已经存在的某个树(或子树)来构造一个新树。 /// </summary> public virtual void Initialize(MNode <TVal> _rootNode) { this.root = _rootNode; }
public MNode(TVal val, MNode <TVal> _parent) { this.theValue = val; this.parent = _parent; }