Similar presentations:
Деревья. Формальное определение дерева
1. Деревья
Разработала Бубнова НадеждаДмитриевна
2. Пример дерева
3.
• Дерево – это совокупность элементов иотношений, образующих иерархическую
структуру этих элементов.
• Каждый элемент дерева называется вершиной
(узлом) дерева.
• Вершины дерева соединены направленными
дугами, которые называют ветвями дерева.
Начальный узел дерева называют корнем
дерева, ему соответствует нулевой уровень.
Листьями дерева называют вершины, в которые
входит одна ветвь и не выходит ни одной ветви
4. Формальное определение дерева
• Один узел является деревом. Этот же узелтакже является корнем этого дерева.
• Пусть n – это узел, а T 1 , T 2 , ... T m – деревья
с корнями n 1 , n 2 , … n m соответственно.
Можно построить новое дерево, сделав n
родителем узлов n 1 , n 2 , … n m . В этом
дереве n будет корнем, а T 1 , T 2 , ... T m –
поддеревьями этого корня. Узлы n 1 , n 2 , …
n m называются сыновьями узла n .
5. Термины
• Все вершины, в которые входят ветви,исходящие из одной общей вершины,
называются потомками, а сама вершина –
предком. Для каждого предка может быть
выделено несколько потомков(отец, сыновья)
• Определение уровня
1. Уровень корня равен 1
2. Уровень потомка на единицу превосходит
уровень его предка.
6. Высота дерева
• Определение Высота (глубина) дереваравна максимальному уровню вершины в
дереве.
Примечание
Высота пустого дерева равна нулю, высота
дерева из одного корня – единице.
7. Деревья высоты 4
43
2
1
8. Определения
• Поддерево – часть дерева, которая можетбыть представлена в виде отдельного дерева.
• Степенью вершины в дереве называется
количество дуг, которое из нее выходит.
• Степень дерева равна максимальной степени
вершин, входящих в дерево.
(При этом листьями в дереве являются
вершины, имеющие нулевую степень)
9. Типы деревьев
По величине степени выделены два типадеревьев:
• двоичные – степень дерева не более двух;
• сильноветвящиеся – степень дерева
произвольна
10. Типы деревьев
• Упорядоченное дерево – это дерево, укоторого ветви, исходящие из каждой
вершины, упорядочены по определенному
критерию.
11. Типы бинарных деревьев
12. Типы бинарных деревьев
• строгие – вершины дерева имеют степеньноль (у листьев) или два (у узлов);
• нестрогие – вершины дерева имеют
степень ноль (у листьев), один или два (у
узлов);
• полные – на всех уровнях, кроме
последнего, узлы степени 2, а на последнем
– степени 0.
13. Представление бинарных деревьев в памяти
• Списковая структура• Векторное представление
14. Представление бинарных деревьев списковой структурой
15. Представление бинарных деревьев в векторной памяти
Для хранения дерева выделяетсямассив. Например, массив А. Корень
хранится в элементе массива А[1]. Для
остальных узлов справедливо
утверждение: если отец записан в
элементе A[I], то его левый сын в A[2*I],
а правый сын – в A[2*I+1].
d1
d2
d3
d4
d5
1
2
3
4
5
d6
6
7
16. Информация в узле бинарного дерева
• информационное поле (ключ вершины);• служебное поле (их может быть несколько
или ни одного);
• указатель на левое поддерево;
• указатель на правое поддерево.
17. Термины
• Длина пути от корня до узла соответствуетуровню узла.
• Длина внутреннего пути – сумма длин путей
до всех узлов дерева(их иногда называют
внутренними).
• Внешний узел – обозначение позиции вставки
нового узла в бинарном дереве.
• Длина внешнего пути – сумма длин путей до
всех внешних узлов дерева.
18. Пример внешних узлов
Внешние узлы помечены NULL19. Дерево поиска
Дерево, для каждого узла которого все ключиузлов его левого поддерева меньше ключа
этого узла, а все ключи его правого
поддерева больше, называется деревом
поиска или двоичным упорядоченным
деревом.
20. Пример дерева поиска
21. Операции с двоичными деревьями(деревья поиска)
Поиск в дереве;
Обход дерева;
Включение узла в дерево;
Удаление узла из дерева.
22. Поиск в дереве. Алгоритм
• Если дерево не пусто, то нужно сравнитьискомый ключ с ключом в корне дерева:
• если ключи совпадают, поиск завершен;
• если ключ в корне больше искомого,
выполнить поиск в левом поддереве;
• если ключ в корне меньше искомого,
выполнить поиск в правом поддереве.
• если дерево пусто, то искомый элемент не
найден.
23. Обходы дерева
• прямой,• обратный ,
• симметричный обходы.
24. Прямой обход
• Если дерево T является нулевым деревом, то всписок обхода записывается пустая строка;
• Если дерево T состоит из одного узла, то в
список обхода записывается этот узел;
• Сначала посещается корень n ,
• в прямом порядке посещаются узлы левого
поддерева,
• в прямом порядке посещаются узлы правого
поддерева
25.
26. Обратный обход .
Обратный обход .• Если дерево T является нулевым деревом, то в
список обхода записывается пустая строка;
• Если дерево T состоит из одного узла, то в
список обхода записывается этот узел;
• Посещаются в обратном порядке все узлы
левого поддерева,
• Посещаются в обратном порядке все узлы
правого поддерева,
• посещается корень n .
27.
28. Симметричный обход .
Симметричный обход .• Если дерево T является нулевым деревом, то в
список обхода записывается пустая строка;
• Если дерево T состоит из одного узла, то в
список обхода записывается этот узел;
• В симметричном порядке посещаются все узлы
левого поддерева,
• Посещается корень,
• В симметричном порядке посещаются все узлы
правого поддерева.
29.
30. Вставка узла в дерево поиска(алгоритм)
Вставка узла в дерево поиска(алгоритм)Для того чтобы вставить узел, необходимо найти его место.
1. Сравним вставляемый ключ с корнем, если ключ больше,
чем ключ корня, и правый потомок есть, уходим в правое
поддерево, а иначе, при условии существования левого
потомка -в левое. Если потомков нет – дошли до позиции
вставки.
2. Выполняем пункт 1, пока не дойдем до позиции вставки.
3. Сравниваем вставляемый ключ с ключом найденного узла.
Если ключ меньше ключа найденного узла, то добавляем
листу левого сына, а иначе – правого сына. Например,
необходимо вставить в дерево, изображенное на рисунке,
узел с ключом 5.
31. Пример вставки ключа 5
32. Удаление узла Рассмотрим ситуации
• Удаление листа33. Описание ситуации(нет потомков)
• Если узел является конечным (то есть неимеет потомков), то его удаление не
вызывает трудностей, достаточно обнулить
соответствующий указатель узла-родителя
34. Удаление узла, имеющего одного потомка
35. Описание ситуации(1 потомок)
• Потомок удаляемого узла становится темже потомком отца удаляемого узла, каким
был удаляемый узел
36. Удаление узла с двумя потомками(1-простая ситуация)
Удаление узла с двумя потомками(1простая ситуация)37. Описание ситуации
• Есть простой особый случай: если у правогопотомка удаляемого узла нет левого
потомка, удаляемый узел заменяется на
своего правого потомка, а его левый
потомок подключается вместо
отсутствующего левого потомка к
замещающему узлу.
38. Удаление узла с двумя потомками(2)
39. Описание ситуации
• В общем же случае на место удаляемогоузла ставится самый левый лист его правого
поддерева (или наоборот – самый правый
лист его левого поддерева). Это не
нарушает свойств дерева поиска.
• Корень дерева удаляется по общему
правилу за исключением того, что
заменяющий его узел не требуется
присоединять к узлу-родителю.
40. Комментарии к удалению(1)
• В функцию del передаютсяуказатель root на корень дерева и
ключ key удаляемого элемента. С помощью
функции fnd определяются указатели на
удаляемый элемент p и его предка parent .
Если искомого элемента в дереве нет, то
выдается сообщение ( {6}) .
41. Комментарии к удалению(2)
• В операторах определяется указатель на узел y ,который должен заменить удаляемый. Если у
узла p нет левого поддерева, на его место будет
поставлена вершина (возможно пустая) его правого
поддерева.
• Иначе, если у узла p нет правого поддерева, на его
место будет поставлена вершина его левого
поддерева.
• В противном случае, когда оба поддерева существуют,
для определения замещающего узла вызывается
функция spusk , выполняющая спуск по дереву.
42. Комментарии к удалению(3)
• В функции spusk первым делом проверяетсяособый случай, описанный выше. Если же этот
случай (отсутствие левого потомка у правого
потомка удаляемого узла) не выполняется,
организуется цикл, на каждой итерации которого
указатель на текущий элемент запоминается в
переменной pred , а указатель y смещается вниз
и влево до того момента, пока не станет
ссылаться на узел, не имеющий левого потомка
(он-то нам и нужен).
43. Комментарии к удалению(4)
• В операторе к этой пустующей ссылкеприсоединяется левое поддерево удаляемого
узла. Перед тем как присоединять к этому узлу
правое поддерево удаляемого узла, требуется
«пристроить» его собственное правое поддерево.
Мы присоединяем его к левому поддереву
предка узла y , заменяющего удаляемый,
поскольку этот узел перейдет на новое место.
• Функция spusk возвращает указатель на узел,
заменяющий удаляемый.
44. Комментарии к удалению(5)
• Если мы удаляем корень дерева, надообновить указатель на корень, иначе –
присоединить этот указатель к
соответствующему поддереву предка
удаляемого узла.
• После того как узел удален из дерева,
освобождается занимаемая им память.