Код обхода дерева сайта
От: Ocenochka  
Дата: 01.11.06 10:23
Оценка:
Есть дерево(сайт), имеющее на каждом уровне влоденности неограниченное число узлов(страниц). Каждый узел имеет список дочерних узлов, и уровень.
Нужно пройти дерево спускаясь на уровень ниже только при полном проходе текущего уровня.
Приложением к задаче является то, что нужно собирать только локальные ссылки.

Поскольку не считаю себя умеющим выражать красиво свои мысли на языке программирования(как и на обычном языке), прошу посмотреть и поправить мой код.

Вот, что у меня получилось:
    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()" удаляется и при том первый объект из очереди;
Люблю ставить оценки.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.