【问题标题】:How to count number of nodes under selected user on specific Level?如何计算特定级别上选定用户下的节点数?
【发布时间】:2012-09-13 16:24:19
【问题描述】:

我有一个 MySQL 数据库,我将用户记录存储在下面的表结构中

User_mst
-------------------
id
user_name
parent_id
left_id
right_id
position       (keyword "left", "right" as string)
node_level

我将用户记录存储在二叉树结构中,也就是说每个节点(用户)下最多有2个子节点。

从这个结构中,我想创建一个函数

输入:

1.user_id
2.level
3.position

输出应该是:

给定user_id、给定level和给定position下的节点数。

例如如果函数如下所示

get_nodes(3, 4, 'left');

然后它应该返回: 在级别 4

的用户 ID 3 下有 X 个节点

我认为我必须构建一个将递归处理的函数,尽管我想要建议。

请帮我建立这个功能。使用任何编程语言,例如 C、PHP 等。 我只是在这里寻找逻辑。

这里是创建表的 SQL 和一些示例插入语句:

http://paste.ubuntu.com/1218345/

提前致谢

【问题讨论】:

  • node_level和参数level如何对应?您的数据库表看起来像是一个邻接列表模型和嵌套集合+级别信息的混合体。
  • 感谢您关注@VolkerK。 node_level 和 level 指向同一个 db 字段 node_level。它是整个二叉树中节点的级别,例如称为根节点的第一个节点将具有 0 级别。之后会出现 1..2..3 关卡。我希望这会有所帮助。
  • 而get_nodes()的参数level应该是相对于user_id标识的节点还是完整树中的绝对值?
  • 您只需将 level 与 node_level 进行比较。因为这将是全局相对于整棵树。或者让我知道我是否误解了
  • 嗯,一个示例树(最好是 sql INSERT 语句)和一些示例查询 + 预期结果会有所帮助...

标签: php mysql c linked-list binary-tree


【解决方案1】:

如果你只是在寻找逻辑,那么伪 C 代码应该没问题:

struct NodeStructure
{
  int ID;
  int leftID;
  int rightID;
  int level;
  ...
};

int countChildren( int nodeID, int level )
{
  NodeStructure * node = find( nodeID );

  if( node == NULL )
    return 0;

  if( node.level == level )
    return 1;

  return countChildren( x.leftID, level ) + countChildren( x.rightID, level );

}

NodeStructure * find( int nodeID )
{
  // SQL CODE:
  // SELECT * FROM User_mst WHERE id = nodeID;

  // if( /* node has been found */ )
    // fill NodeStructure
  // else
    // return NULL;
}

【讨论】:

  • 感谢@Sdra,但是关卡在哪里使用??作为这件事我已经做了你在这里所做的事情。我想要的重要的是获得特定级别的计数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多