Вот какой-то псевдокод. Идея проста: начните со всех немаркированных узлов и отметьте родительский узел вашего текущего узла, его родительский и т. Д., Пока не дойдете до корня. Делая это, вы пометите точно узлы на пути от вашего текущего узла к корню. Затем вы можете просто напечатать все узлы за один проход, повторяя только на «помеченных» узлах. Это оптимально (время выполнения - самое большее количество узлов, которые вы должны распечатать).
for all n: mark[n]=False
n=current
while n!=root:
n=parent[n]
mark[n]=True
def print_tree(n):
print_node(n)
if mark[v]==True:
print '<ul>'
for each child c of n: print_tree(c)
print '</ul>'
def print_node(n):
if n==current: print '<li class="current">' else: print '<li>'
print name[n]
print "</li>"
print_tree(root)
parent[n]
и name[n]
- это, вероятно, что-то вроде n.parent
и n.name
в вашей структуре. Что касается части "для каждого дочернего элемента n" - я предполагаю, что у вас есть список смежности, в котором содержится список всех дочерних элементов данного узла. (Если нет, то в каком порядке следует печатать дочерние элементы?). В любом случае, списки смежности можно построить за время O (количество узлов), просто добавив каждый узел в список «дочерних элементов» его родитель. Размер списков total не превышает количество узлов (поскольку каждый узел, отличный от корня, находится ровно в одном из списков), поэтому эти списки не занимают много памяти (один список может содержать много элементов, но общий размер ограничен).