|
|||||
![]() Другие алгоритмы. Cтруктуры данных. Хранение информации.ОБХОДЫ ДЕРЕВЬЕВ
Пусть дерево G задано множеством вершин V ( корневая вершина v0 ), дуг - E и Г(v,-) - перечнем потомков вершины v из V. Во многих задачах требуется просмотреть и обработать процедурой USE все вершины V в точности по одному разу. Имеется много различных способов реализовать такой обход, в различном порядке просматривая вершины дерева. Обходы вглубь основаны на продолжении начатого пути до конечных вершин, вширь - на последовательном просмотре вершин уровня 0 - корневой, 1 - смежных с ней, 2, 3 и т.д., см. рис. Обход дерева вглубь в прямом порядке ( от корней к листьям ):Обход порождает следующую последовательность: 0 - 1 - 4 - 5 - 2 - 6 - 7 - 8 - 3
Запуск процедуры обращением WALK(v0), процедура USE(v) реализует обработку вершины v. Hерекурсивный вариант реализации обхода дерева вглубь в прямом порядке потребует использования первоначально пустого стека STACK
--------------| |-------------------------|
| | | |
->¦ v0 => STACK ¦->¦WHILE STACK # ПУСТО DO ¦---->
| | | |
--------------| |-------------------------|
V ¦
|-----------------| ¦
| |
¦ v<=STACK ¦ ¦
| |
¦ USE(v) ¦->-
| |
¦ Г(v,-) => STACK ¦
------------------- |-----------------------|
| |
|----------------| ¦ FOR w из Г(v,-) DO ¦->
| | | |
Оператор ¦Г(v,-) => STACK ¦ означает |------+----------------|
| |
|----------------| |----v-------| ¦
| | |
(запись в стек всего содержимого Г(v,-) ) ¦ w => STACK+>---
| |
|------------|
Примеры использования обхода:- решение задачи методом деления на части - разузлование сверху - стратегия "разделяй и властвуй" (Сортировка Фон Hеймана, быстрая сортировка, одновременное нахождение максимума и минимума последовательности чисел, умножение длинных чисел). Обход дерева вглубь в обратном порядке - начиная с концевых вершин.4 - 5 - 1 - 6 - 8 - 7 - 2 - 3 - 0 потребует другой организации рекурсивной процедуры BACK(v)
да --------------------->------------------¬
------+------¬ ----------------------¬ ---V---¬ ---------¬
->¦Г(v,-) ПУСТО ¦->¦ FOR w из Г(v,-) DO ¦->¦USE(v) ¦-->¦v<=STACK ¦-->
-------------нет ------+---------------- -------- ----------
-----v-----¬ ¦
¦ BACK(w) ¦->-
------------
Обращение для запуска BACK(v0). Hерекурсивная версия этого обхода
реализуется аналогичным образом с использованием стека.
Примеры использования обхода:- анализ игр с полной информацией, - разузлование снизу, - динамическое программирование.
Обход дерева вширь (сначала уровень 0, затем 1, и т.д.)в нашем случае: 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8потребует использования уже не стека, а очереди QUEUE
---------¬ --------------------------¬
--->¦v=>QUEUE ¦-->¦WHILE QUEUE # ПУСТО DO ¦-------->
---------- ----------+----------------
---------v--------¬ ¦
¦ w<=QUEUE ¦ ¦
¦ USE(w) ¦>--
¦ Г(w,-) => QUEUE ¦
-------------------
Вверх по странице, к оглавлению и навигации. | |||||