这是一些伪代码。这个想法很简单:从所有未标记的节点开始,然后标记当前节点的父节点、其父节点等等,直到到达根节点。通过这样做,您将准确标记从当前节点到根的路径上的节点。然后您可以简单地打印另一遍中的所有节点,仅在“标记”节点上递归。这是最佳的(运行时间最多是您必须打印的节点数)。
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 的每个孩子”部分——我假设你有一个邻接列表维护给定节点的所有孩子的列表。(如果你不这样做,那么子节点的打印顺序是什么?)在任何情况下,只需将每个节点添加到它的父母。列表的总大小最多是节点的数量(因为除根以外的每个节点都恰好出现在其中一个列表中),因此这些列表不会占用太多内存(单个列表可能包含很多元素,但是总大小是有界的)。