public override (bool repairAttempted, bool repairSuccesfull) repair(Node n) { if (isMet(n)) { return(false, false); } placeHolder.Value.Clear(); n.gatherAllNodesInSubtree(placeHolder.Value); var sameTypeNodes = placeHolder.Value.Where(q => q.type == rootOfSubtreeToContain.type); if (sameTypeNodes.Any()) //if it contains nodes of the same type, one of them is selected and replaced by copy of the required subtree { var list = sameTypeNodes.ToList(); var selectedNode = list[r.Next(list.Count)]; var predecessor = selectedNode.predecessor; predecessor.setSuccessor(rootOfSubtreeToContain.createDeepCopy(), selectedNode.indexInParrentsSlot); return(true, true); } var sameClassNodes = placeHolder.Value.Where(q => q.getNodeClass() == rootOfSubtreeToContain.getNodeClass()); if (sameClassNodes.Any()) //if it contains nodes of the same class, one of them is selected and replaced by copy of the required subtree { var list = sameClassNodes.ToList(); var selectedNode = list[r.Next(list.Count)]; var predecessor = selectedNode.predecessor; predecessor.setSuccessor(rootOfSubtreeToContain.createDeepCopy(), selectedNode.indexInParrentsSlot); return(true, true); } return(true, false); }
public void setNodeConnectedToSlot(Node n) { if (n.getNodeClass() != this.argumentClass) { throw new Exception(); } nodeConnectedToSlot = n; }