【问题标题】:Modified preorder tree traversal - finding the next node修改前序树遍历——寻找下一个节点
【发布时间】:2009-12-05 21:47:11
【问题描述】:

我有这些数据:

id | parent_id | lft | rgt | name
=====================================
1  | 0         | 1   | 8   | abc
2  | 3         | 5   | 6   | jkl
3  | 1         | 2   | 3   | def
4  | 0         | 9   | 10  | mnno
5  | 1         | 4   | 7   | ghi

我需要按以下顺序(id)遍历这个层次结构:1 > 3 > 5 > 2 > 4

我怎样才能做到这一点?

假设我要查找node_x的下一个节点。

if (node_x_rgt - node_x_lft == 1) {
    next_node_lft = node_x_rgt + 1;
} else {
    next_node_lft = node_x_lft + 1;
}

此公式仅在某些情况下有效(节点 ID 为 1、3、5、2)。节点2的下一个节点应该是4。

【问题讨论】:

  • 嗨,Pondidum。我已经更新了问题。

标签: php mysql algorithm mptt


【解决方案1】:

根据您提供的信息,我只能尝试:

select * from table order by id

顺便说一句,id 4 的 lft 和 rgt 列在树之外,看起来像一个错误?

btw2,如果这是作业,请标记它。

编辑:问题的第 2 版:

这些类型的树对于所有节点都具有(lft < rgt) 的不变性。如果表仅包含 1 个根节点,则可以通过 lft 或 rgt 值检索序列,在这种情况下,lft 仍然可以解决问题(但通过 rgt 降序排列的替代方案不会):

select * from table order by lft

【讨论】:

  • 谢谢回复。实际上,是的,id 4 是一棵单独的树。 id 2 是节点 id 1 的树的最后一个节点。如果我请求 id 2 的下一个节点,它应该给我下一棵树的第一个节点(节点 id 4 的树)。
  • 按id订购对我有什么帮助?这也不是功课:)
  • Ordering by id 有助于解决第一个版本的问题,其中请求的订单是 1,2,3,4,5 :-)
  • 是的,我认为这解决了“下一个节点”的问题。但是正如您所说的“......但是通过 rgt 降序排列的替代方案不会......”,这不适用于查找前一个节点,对吧?
  • rsp,如果我把所有的树都放在一个根节点下呢?
猜你喜欢
  • 1970-01-01
  • 2011-12-01
  • 1970-01-01
  • 2011-10-17
  • 2011-02-10
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多