Есть дерево(сайт), имеющее на каждом уровне влоденности неограниченное число узлов(страниц). Каждый узел имеет список дочерних узлов, и уровень.
Нужно пройти дерево спускаясь на уровень ниже только при полном проходе текущего уровня.
Приложением к задаче является то, что нужно собирать только локальные ссылки.
Поскольку не считаю себя умеющим выражать красиво свои мысли на языке программирования(как и на обычном языке), прошу посмотреть и поправить мой код.
Вот, что у меня получилось:
class Page
{
// Адрес текущей страницы
public Uri uri;
// Список ссылок текущей страницы
public List<Uri> childUri;
// Уровень текущей страницы
public Int32 level;
public Page(Uri _uri, Int32 _level)
{
uri = _uri;
level = _level;
}
}
class Site
{
// Рабочая очередь для прохода по страницам
Queue<Page> queue = new Queue<Page>();
// Список всех собраных страниц - фактически дерево.
List<Page> pages = new List<Page>();
// Максимальная глубина
Int32 maxLevel = 5;
// Текущий хост
String host;
Site(Page page)
{
page.level = 1;
host = page.uri.Host;
Add(page);
}
void Start()
{
while(true)
{
Page page = queue.Dequeue();
if ((page == null) || (page.level > maxLevel))
break;
// Рассматриваем страницы только текущего хоста
if (page.uri.Host != host) break;
// Заполним page.childUri
page.childUri = GetLinks(page);
// Поставим в очередь
for (Int32 i = 0; i < page.childUri.Count; ++i)
{
Page newPage = new Page(page.childUri[i], page.level + 1);
if (newPage.uri.Host == page.uri.Host)
{
Add(newPage);
}
}
}
}
// Заглушка
List<Uri> GetLinks(Page page)
{
List<Uri> listUri = null;
return listUri;
}
// Добавляет найденную страницу в очередь и список.
void Add(Page page)
{
queue.Enqueue(page);
pages.Add(page);
}
}
В итоге получаем список всех страниц сайта. Для каждой страницы имеем список ссылок и уровень. Невнимательно смотрел на класс Queue — исходил из того, что при "queue.Dequeue()"
удаляется и при том
первый объект из очереди;