标签: modified-preorder-tree-t

在数据库中存储复合模式(分层数据)

在关系数据库中保存复合模式的"最佳实践"是什么?

我们一直在使用Modified Preorder Tree Traversal.这可以非常快速地构建整个树,但插入或删除新节点的速度非常慢(需要调整所有左右值).查询节点的子节点也不容易且非常慢.

我们注意到的另一件事是你必须确保树不会变得混乱.您需要事务锁定,否则左侧和右侧值可能会损坏,修复损坏的左侧树不是一件容易的事.

它确实工作得非常好,修改后的预订树遍历,但我想知道是否有更好的选择.

database modified-preorder-tree-t hierarchical-data

8
推荐指数
1
解决办法
5173
查看次数

PHP中遍历树的数据结构?

我没有CS或数据结构的背景知识.我想创建一个PHP类,它存储一个修改过的预订序横向树,用于操作和与数据库同步.

基本上我需要存储数据,如:

+-------------+----------------------+-----+-----+
| category_id | name                 | lft | rgt |
+-------------+----------------------+-----+-----+
|           1 | ELECTRONICS          |   1 |  20 |
|           2 | TELEVISIONS          |   2 |   9 |
|           3 | TUBE                 |   3 |   4 |
|           4 | LCD                  |   5 |   6 |
|           5 | PLASMA               |   7 |   8 |
|           6 | PORTABLE ELECTRONICS |  10 |  19 |
|           7 | MP3 PLAYERS          |  11 |  14 | …
Run Code Online (Sandbox Code Playgroud)

php mptt modified-preorder-tree-t data-structures

7
推荐指数
1
解决办法
6068
查看次数

如何根据树遍历算法从此结果集生成树视图?

我有这张桌子:

CREATE TABLE `categories` (
  `id` int(11) NOT NULL auto_increment,
  `category_id` int(11) default NULL,
  `root_id` int(11) default NULL,
  `name` varchar(100) collate utf8_unicode_ci NOT NULL,
  `lft` int(11) NOT NULL,
  `rht` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  KEY `category_id` (`category_id`),
  KEY `lft` (`lft`,`rht`),
  KEY `root_id` (`root_id`)
) 
Run Code Online (Sandbox Code Playgroud)

基于这个问题: 将修改后的预订树遍历模型(嵌套集)转换为<ul>

不同的是,我在一张桌子上有很多树.每行都有一个代表其父级及其顶级父级的外键:category_id和root_id.我还有基于这个例子的lft和rht字段:http://articles.sitepoint.com/article/hierarchical-data-database/2

基于这些行:

INSERT INTO `categories` VALUES(1, NULL, NULL, 'Fruits', 1, 14);
INSERT INTO `categories` VALUES(2, 1, 1, 'Apple', 2, 3);
INSERT INTO `categories` VALUES(3, 1, 1, 'Orange', 4, 9);
INSERT INTO …
Run Code Online (Sandbox Code Playgroud)

html php mysql sql modified-preorder-tree-t

7
推荐指数
1
解决办法
1530
查看次数

修改的预订树遍历:选择1级深的节点

我使用修改的预订树遍历算法保存了分层有序数据.

这是表格内容:

id  lft  rgt  name
1   1    10   topnode
2   2    3    level1
3   4    7    level1
4   5    6    level2
5   8    9    level1
Run Code Online (Sandbox Code Playgroud)

可视化:

方案

我想要的只是选择某个节点的子节点(所以不是子节点的子节点).让我们说'topnode'.我正在尝试修复查询,但我似乎无法理解它.

搜索互联网给我带来了一段时间,例如:我可以计算每个节点的深度,但我似乎无法选择它.

这个查询

SELECT node.*, (COUNT(parent.id) - 1) AS depth
FROM tree AS node
CROSS JOIN tree AS parent
WHERE (node.lft BETWEEN parent.lft AND parent.rgt)
GROUP BY node.id
ORDER BY node.lft
Run Code Online (Sandbox Code Playgroud)

显示每个节点的深度:

id  lft  rgt  name     depth
1   1    10   topnode  0
2   2    3    level1   1
3   4    7    level1   1
4 …
Run Code Online (Sandbox Code Playgroud)

sql modified-preorder-tree-t hierarchical-data

3
推荐指数
1
解决办法
2519
查看次数

算法DFS找到的生成树是否始终按预先显示?

我正在c + +中实现DFS算法以找到生成树,使用算法DFS的生成树的输出总是预先排序或者它是纯粹的巧合吗?

c++ recursion backtracking modified-preorder-tree-t depth-first-search

0
推荐指数
1
解决办法
391
查看次数