public void DeepDFS() { int maxDeep = 0; theStack.Push(root); root.wasVisited = true; SuffixNode currentNode = null; while (theStack.Count != 0) { currentNode = getUnvisitedChild(theStack.Peek()); if (currentNode == null) { theStack.Pop(); maxDeep--; } else { currentNode.wasVisited = true; theStack.Push(currentNode); maxDeep++; if (maxDeep > treeDeep) { treeDeep = maxDeep; } } } }
public void AddSuffix(SuffixNode node, StringBuilder suffix, int position, int removeIndex) { int AddNodePosition = 0; int suffix0_index = input.IndexOf(suffix[0]); SuffixNode currentNode = node.FindChild(input[removeIndex]); if (currentNode != null) { string currentSuffix = input.Substring(currentNode.position, currentNode.length); while (AddNodePosition != currentNode.length && AddNodePosition != suffix.Length && suffix[AddNodePosition] == currentSuffix[AddNodePosition]) // Пока длина суффикса не равна 0 и // совпадают первые символы суффиксов { ++AddNodePosition; } if (AddNodePosition == suffix.Length) { return; } else if (AddNodePosition == currentSuffix.Length && currentNode.child.Count == 0) // Если пришли в лист { currentNode.length++; currentNode.position = removeIndex; return; } else if (AddNodePosition == currentSuffix.Length && currentNode.child.Count != 0) { string str = suffix.ToString().Substring(AddNodePosition); StringBuilder str1 = new StringBuilder(); str1.Append(str); AddSuffix(currentNode, str1, position, removeIndex + AddNodePosition); } else // если остановились на мнимой вершине { node.RemoveChild(currentNode.element); node.child.Add(new SuffixNode(currentNode.position, AddNodePosition, input[currentNode.position])); nodeNumber++; nodeNumber++; node.FindChild(input[currentNode.position]).child.Add(currentNode); node.FindChild(input[currentNode.position]).child.Add(new SuffixNode(position - (suffix.Length - AddNodePosition), suffix.Length - AddNodePosition, input[position - (suffix.Length - AddNodePosition)], listNumber++)); SuffixNode temp_leaf = node.FindChild(input[currentNode.position]); leafs.Add(temp_leaf.FindChild(input[position - (suffix.Length - AddNodePosition)])); currentNode.position = currentNode.position + AddNodePosition; currentNode.length = currentSuffix.Length - AddNodePosition; currentNode.element = input[currentNode.position]; return; } } else // Если вершина не нашлась { node.child.Add(new SuffixNode(removeIndex, suffix.Length, input[removeIndex], listNumber++)); leafs.Add(node.FindChild(input[removeIndex])); nodeNumber++; } }
public SuffixNode getVisitedChild(SuffixNode node) { foreach (SuffixNode child in node.child) { if (child.wasVisited == true) { return(child); } } return(null); }
private void DrawTree(SuffixTree suffixTree) { suffixTree.removeMarks(); dX = sheet.Width / suffixTree.nodeNumber; drawTree = new DrawTree(sheet.Width, sheet.Height, suffixTree.input); var x = drawTree.R + 10; var y = drawTree.R; //drawTree.clearSheet(); sheet.Image = drawTree.GetBitmap(); drawTree.clearSheet(); suffixTree.theStack.Push(suffixTree.root); suffixTree.root.wasVisited = true; suffixTree.root.center.X = sheet.Width / 2; suffixTree.root.center.Y = y; drawTree.DrawNode(suffixTree.root.center); SuffixNode currentNode = null; SuffixNode parentNode = null; while (suffixTree.theStack.Count != 0) { parentNode = suffixTree.theStack.Peek(); currentNode = suffixTree.getUnvisitedChild(suffixTree.theStack.Peek()); if (currentNode == null) { suffixTree.theStack.Pop(); y -= dY; } else { y += dY; currentNode.wasVisited = true; suffixTree.theStack.Push(currentNode); sheet.Image = drawTree.GetBitmap(); currentNode.center.X = x; currentNode.center.Y = y; drawTree.DrawEdge(parentNode, currentNode); x += dX; } } for (var i = 0; i < suffixTree.selectedLeafs.Count; i++) { drawTree.DrawSelectedLeaf(suffixTree.selectedLeafs[i]); } }
public void DrawEdge(SuffixNode node1, SuffixNode node2) { gr.DrawLine(blackPen, node1.center, node2.center); if (node1.listNum != -1) { //drawTree.DrawList(x, y, currentNode.listNum); DrawList(node1.center, node1.listNum); } else { DrawNode(node1.center); } if (node2.listNum != -1) { //drawTree.DrawList(x, y, currentNode.listNum); DrawList(node2.center, node2.listNum); } else { DrawNode(node2.center); } if (node2.length != -1) { double length = Math.Sqrt(Math.Pow(node2.center.X - node1.center.X, 2) + Math.Pow(node2.center.Y - node1.center.Y, 2)); double x = node1.center.X; double y = node1.center.Y; double dX = node2.center.X - node1.center.X; double dY = node2.center.Y - node1.center.Y; double delta = length / node2.length; double deltaX = dX / (node2.length + 2); double deltaY = dY / (node2.length + 2); x += deltaX; y += deltaY; for (int i = node2.position; i < node2.position + node2.length; i++) { gr.DrawString(input[i].ToString(), font, brush, Convert.ToSingle(x - 9), Convert.ToSingle(y - 9)); x += deltaX; y += deltaY; } } }
public List <SuffixNode> ReturnLists(SuffixNode node) { List <int> returnLists = new List <int>(); for (int i = 0; i < node.child.Count; i++) { if (node.child[i].listNum != -1) { returnList.Add(node.child[i]); } else { ReturnLists(node.child[i]); } } return(returnList); }
public void removeMarks() { int maxDeep = 0; theStack.Push(root); root.wasVisited = false; SuffixNode currentNode = null; while (theStack.Count != 0) { currentNode = getVisitedChild(theStack.Peek()); if (currentNode == null) { theStack.Pop(); maxDeep--; } else { currentNode.wasVisited = false; theStack.Push(currentNode); } } }
public List <SuffixNode> SearchSuffix(SuffixNode node, string suffix) { //List<int> returnList = new List<int>(); int AddNodePosition = 0; SuffixNode currentNode = node.FindChild(suffix[0]); if (currentNode != null) { string currentSuffix = input.Substring(currentNode.position, currentNode.length); while (AddNodePosition != currentNode.length && AddNodePosition != suffix.Length && suffix[AddNodePosition] == currentSuffix[AddNodePosition]) // совпадают первые символы суффиксов { ++AddNodePosition; } if (AddNodePosition == suffix.Length) { if (currentNode.listNum != -1) { returnList.Add(currentNode); } else { ReturnLists(currentNode); } } else { SearchSuffix(currentNode, suffix.Substring(AddNodePosition)); } } else { return(returnList); } return(returnList); }
public void DrawSelectedLeaf(SuffixNode node) { gr.DrawEllipse(redPen, (node.center.X - R), (node.center.Y - R), 2 * R, 2 * R); }