public void WalkWide(int n, ReDrawDelegate reDrawMethod) //обход в ширину { if (n < 0 || n >= Count()) { throw new ApplicationException("Start vertex index is out of range"); } ResetVisit(); ResetInTree(); Queue <int> queue = new Queue <int>(); //создаем очередь и кладем в нее начальную вершину queue.Enqueue(n); vList[n].Visit = true; //делаем ее посещенной UpdateWithSleep(reDrawMethod); while (queue.Count > 0) //пока очередь не пуста { n = queue.Dequeue(); //забираем первый элемент очереди и его номер записываем в n UpdateWithSleep(reDrawMethod); for (int i = 0; i < vList[n].Edges.Count; i++) //перебираем все ребра этого элемента { int m = NumNode(vList[n], vList[n].Edges[i]); //в m записываем номер вершину, в которую ведёт данное ребро if (!vList[m].Visit) //если вершина m не посещена { queue.Enqueue(m); //кладём её в очередь vList[m].Visit = true; //делаем ее посещенной UpdateWithSleep(reDrawMethod); } } } UpdateWithSleep(reDrawMethod); }
public void WalkDeep(int n, ReDrawDelegate reDrawMethod) //обход в глубину { if (n < 0 || n >= Count()) { throw new ApplicationException("Start vertex index is out of range"); } ResetVisit(); ResetInTree(); Stack <int> stack = new Stack <int>(); stack.Push(n); //Создается стек и кладется начальная вершина vList[n].Visit = true; //Начальная вершина делается посещенной UpdateWithSleep(reDrawMethod); while (stack.Count > 0) //пока стек не пуст { n = stack.First(); //смотрим вершину в начале стека и записываем ее номер в n int i = 0; int m = -1; while (i < vList[n].Edges.Count()) //перебираем все рёбра вершины n { m = NumNode(vList[n], vList[n].Edges[i]); //в m записываем номер вершину, в которую ведёт данное ребро if (!vList[m].Visit) //если m не посещена { stack.Push(m); //кладём m в стек vList[m].Visit = true; //и делаем ее посещенной UpdateWithSleep(reDrawMethod); break; } i++; } if (i == vList[n].Edges.Count()) //если не оказалось непосещенных соседей вершины n { stack.Pop(); //забираем верхний элемент стека (там вершина n) UpdateWithSleep(reDrawMethod); } } UpdateWithSleep(reDrawMethod); }
private void UpdateWithSleep(ReDrawDelegate reDrawMethod) //перерисовка экрана с задержкой через делегат { Thread.Sleep(500); //задержка reDrawMethod?.Invoke(); //вызов перерисовки }