|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
12.09.2011, 15:45 | #1 |
Пользователь
Регистрация: 14.04.2011
Сообщений: 31
|
Бинарное дерево из массива
Доброго времени суток. Возник вопрос.Стояла задача построить дерево посредством массивов
1.каждая родительская вершина может иметь не более двух потомков; 2.для каждой родительской вершины "левый" потомок меньше нее по весу, а "правый" – больше; 3.для каждой родительской вершины каждый из элементов ее "левого" поддерева меньше нее по весу, а "правого" - больше. Т.е.если у нас 10, 3, 7, 2, 1, 4, 5, 13, 8, 6, 14, 9, 11, 15, 12. То дерево 8 4 12 2 6 10 14 1 3 5 7 9 1 13 15 Частично я задачу решил но запутался в измышлениях По логике здесь формула количества вершин 2^n-1 И сначала надо отсортировать 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Выбрать середину Потом также выбрать середины у оставшихся кусков 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Далее привожу код который составил.Правда слишком всё сложно и вышло составить только левую ветвь и то элементы которые закономерности не поддаются например 5 и 7 прикрепить не удалось.Может быть как то можно облегчить алгоритм? Код:
|
12.09.2011, 16:57 | #2 |
Новичок
Джуниор
Регистрация: 12.09.2011
Сообщений: 1
|
В общем не обязательно необходимо сортировать начальный массив.
Информацию, которую храним для каждой вершины, это ее значение, ссылка на левого потомка, и на правого. При необходимости можно хранить дополнительные поля(например высоту). Далее: Первый элемент массива определяем корнем всего дерева. И для каждого следующего элемента, просто спускаемся по дереву(начиная с корня), и если значение которое хотим добавить больше значения корня, спускаемся вправо, иначе влево, и т.д. пока не упремся в никуда(т.е. некуда дальше спускаться, мы в листе дерева). Сюда как раз таки и вставляем необходимое значение. Вставка элемента работает за О(H), где H - высота дерева. А высота дерева - это H = log(N), тут N - количество вершин в дереве. И количество вершин не обязательно 2^n-1, дерево может быть и не полным. |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Бинарное дерево, С++ | Vladisl | Фриланс | 4 | 07.12.2010 09:27 |
Бинарное дерево. | amsask | Помощь студентам | 1 | 29.04.2010 21:25 |
Бинарное дерево | Lazio | Общие вопросы C/C++ | 2 | 10.09.2009 20:31 |
Бинарное дерево | g0liath | Помощь студентам | 2 | 16.02.2008 23:54 |