private TreeEvalItem <TTreeNode> GetLastLeafAtDepth(TTreeNode node, TreeNodePath path, int targetDepth) { if (path.Count == targetDepth) { return(new TreeEvalItem <TTreeNode>(node, path)); } List <TTreeNode> children = m_traversalParameters.GetChildrenMethod(node).ToList(); for (int childIndex = children.Count - 1; childIndex >= 0; --childIndex) { var result = GetLastLeafAtDepth(children[childIndex], path.CopyAndAddToPath(childIndex), targetDepth); if (result != null) { return(result); } } return(null); }
public void SetupForArbitraryIteration(List <TreeEvalItem <TTreeNode> > nextEvals) { // It's possible we started this iteration arbitrarily TreeNodePath path = this.TargetPath; TTreeNode target = this.Target; while (nextEvals.Count == 0) { var parent = target != null?m_traversalParameters.GetParentMethod(target) : null; if (parent == null) { break; } path = path.CopyAndRemoveEnd(); var children = m_traversalParameters.GetChildrenMethod(parent).ToList(); int index = children.IndexOf(target); if (index + 1 < children.Count) { for (int childIndex = index + 1; childIndex < children.Count; ++childIndex) { nextEvals.Add(new TreeEvalItem <TTreeNode>(children[childIndex], path.CopyAndAddToPath(index))); } return; } target = parent; } }