如果嵌套集具有开箱即用的更好的功能将是不错的.
您发现的技巧是从平面集构建树:
>以一组按lft排序的所有节点开始
>第一个节点是根添加它,因为树的根移动到下一个节点
>如果它是前一个节点的子节点(prev.lft和prev.rht之间的lft)将一个子节点添加到树中并向前移动一个节点
>否则将树向上移动一级并重复测试
见下文:
def tree_from_set(set) #set must be in order
buf = START_TAG(set[0])
stack = []
stack.push set[0]
set[1..-1].each do |node|
if stack.last.lft < node.lft < stack.last.rgt
if node.leaf? #(node.rgt - node.lft == 1)
buf << NODE_TAG(node)
else
buf << START_TAG(node)
stack.push(node)
end
else#
buf << END_TAG
stack.pop
retry
end
end
buf <
end
def START_TAG(node) #for example
"
#{node.name}
- "
end
def NODE_TAG(node)
"
#{node.name}
"end
def END_TAG
""
end
本文介绍了一种从平面集构建树结构的方法,通过按lft排序的节点开始,逐步添加子节点并构建树。算法首先将第一个节点设为根,然后遍历剩余节点,根据节点的lft值判断是否为父节点的子节点,从而决定是添加子节点还是调整树层级。这种方法对于处理嵌套集数据尤为有效。
36万+

被折叠的 条评论
为什么被折叠?



