Задача про деревья :)
От: _Anri_  
Дата: 12.06.05 03:40
Оценка:
Дано:
*бинарное(у одного узла от 0 до 2 потомков) дерево вида:
     1
    / \
   2    3
  / \    \...
 4   5
 ...   ...

ну и так далее.
*дерево описывается таблицей вида:
id(ключ)- идентификатор узла сети.
parentid — идентификатор узла являющегося родителем для данного.
level — номер уровня узла от самой первой ячейки.
*т.е. к примеру, для нарисованного выше дерева таблица выглядит так:
1 0 1
2
1 2
3 1
2
4 2 3

5 2 3
Задача: написать оптимальный код на T-SQL, который заполнял бы колонку level, при условии что ее предварительно сбрасывают в 0.

Вариант с рекурсией красив, но не подходит — уровень вложения процедур не позволяет.
спасибо.
Re: Задача про деревья :)
От: Аноним  
Дата: 12.06.05 15:29
Оценка:
Здравствуйте, _Anri_, Вы писали:

_A_>*дерево описывается таблицей вида:

_A_>id(ключ)- идентификатор узла сети.
_A_>parentid — идентификатор узла являющегося родителем для данного.
_A_>level — номер уровня узла от самой первой ячейки.

для описания бинарного дерева у вас в таблице не хватает описателя направления — лево, право.
а без направления невозможен корректный обход — направления могут перепутаться (хотя это не повлияет на уровень вложенности), да и при реализации прийдется подсчитывать кол-во ссылок.

в одном проекте мне пришлось реализовывать обход бинарного дерева без рекурсии.
требуется использование временного хранилища (последний вошел — первым вышел) для хранения уже пройденных узлов.
и при построении дерева должно быть определено условие — для первого дочернего узла использовать право, для второго лево.
Re[2]: Задача про деревья :)
От: Аноним  
Дата: 12.06.05 15:37
Оценка:
спасибо большое!
LIFO это идея.
да, направление у меня есть в таблице, я забыл написать.
Re: Задача про деревья :)
От: Sinclair Россия https://github.com/evilguest/
Дата: 14.06.05 08:58
Оценка:
Здравствуйте, _Anri_, Вы писали:

_A_>Дано:

_A_>*бинарное(у одного узла от 0 до 2 потомков) дерево вида:
_A_>
_A_>     1
_A_>    / \
_A_>   2    3
_A_>  / \    \...
_A_> 4   5
_A_> ...   ...
_A_>

_A_>ну и так далее.
_A_>Задача: написать оптимальный код на T-SQL, который заполнял бы колонку level, при условии что ее предварительно сбрасывают в 0.
update treeNode set level=1 where parentID = 0
while @@rowcount > 0
  update treeNode set level = p.level+1 from treeNode inner join treeNode p on treeNode.parentId = p.id where treeNode.level = 0 and p.Level > 0
... << RSDN@Home 1.1.4 beta 5 rev. 395>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: Задача про деревья :)
От: Аноним  
Дата: 14.06.05 19:07
Оценка:
спасибо, это гениально )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.