Выполните обход в глубину, начиная с корня, позволяя узлам посещаться несколько раз (график должен быть ацикличным, конечно, чтобы это завершилось). Для каждого посещаемого вами узла графа вы создаете соответствующий узел дерева и подключаете его к соответствующему узлу дерева своего родительского узла графа ( edit: фактически, узел графа может соответствовать более чем одному узлу дерева, вас интересует последнее).
Например, скажем, ваш корень A
:
A
/ \
/ \
B C
\ /
\ /
D
Вы посещаете A
, создаете tA
. Обход идет к B, вы создаете tB
, подключаете его к tA
. Затем вы посещаете 'D', создаете tD
, подключаете его к tB
, затем вы возвращаетесь и посещаете 'C', создаете tC
и подключаете его к tA
, так что вы получаете это дерево:
tA
/ \
/ \
tB tC
| |
| |
tD tD'
Обратите внимание, что таким преобразованием вы можете получить экспоненциально большее дерево по сравнению с графиком.