/// <summary> /// Traversal of <see cref="DecisionTree"/> is done by recusrively calling the <see cref="ADecisionNode.TreeTraversal(ADecisionNode)"/>. /// </summary> public static RefList <AIDecisionTreeChoice> traverseDecisionTree(DecisionTree p_decisionTree) { RefList <AIDecisionTreeChoice> l_choices = new RefList <AIDecisionTreeChoice>(); RefList <TraversalStack> l_traversalStacks = new RefList <TraversalStack>(); l_traversalStacks.Add(TraversalStack.build(p_decisionTree.RootNode)); while (l_traversalStacks.Count > 0) { ref TraversalStack l_currentTraversalStack = ref l_traversalStacks.ValueRef(l_traversalStacks.Count - 1); //If there if the current node has links if (l_currentTraversalStack.DecisionNode.LinkedNodes != null) { if (l_currentTraversalStack.LinkIterationCounter < l_currentTraversalStack.DecisionNode.LinkedNodes.Count) { //We traverse the link and go one level deeper ADecisionNode l_nextNode = l_currentTraversalStack.DecisionNode.LinkedNodes[l_currentTraversalStack.LinkIterationCounter]; l_currentTraversalStack.LinkIterationCounter += 1; TraversalStack l_oneLevelDepperStack = TraversalStack.build(l_nextNode); l_traversalStacks.AddRef(ref l_oneLevelDepperStack); l_nextNode.TreeTraversal(l_currentTraversalStack.DecisionNode); } else { #region Updating stack l_traversalStacks.RemoveAt(l_traversalStacks.Count - 1); #endregion } } else // No links have been found, this means that the current node is a leaf node. { #region Creating the choice as the current node is a leaf ADecisionNode[] l_choiceNodes = new ADecisionNode[l_traversalStacks.Count]; for (int i = 0; i < l_traversalStacks.Count; i++) { l_choiceNodes[i] = l_traversalStacks.ValueRef(i).DecisionNode; } AIDecisionTreeChoice l_choice = AIDecisionTreeChoice.build(l_choiceNodes); l_choices.AddRef(ref l_choice); #endregion l_traversalStacks.RemoveAt(l_traversalStacks.Count - 1); } }
public void RemoveAt(int index) { RefList.RemoveAt(index); }