猿问

将平台解析成树的最有效/优雅的方法是什么?

将平台解析成树的最有效/优雅的方法是什么?

假设您有一个存储有序树层次结构的平面表:


Id   Name         ParentId   Order

 1   'Node 1'            0      10

 2   'Node 1.1'          1      10

 3   'Node 2'            0      20

 4   'Node 1.1.1'        2      10

 5   'Node 2.1'          3      10

 6   'Node 1.2'          1      20

这是我们所拥有的图表[id] Name。根节点0是虚构的。


                       [0] ROOT

                          / \ 

              [1]节点1 [3]节点2

              / \ \

    [2]节点1.1 [6]节点1.2 [5]节点2.1

          /          

 [4]节点1.1.1

您将使用什么简约方法将其输出为HTML(或文本,就此而言)作为正确排序,正确缩进的树?


进一步假设你只有基本的数据结构(数组和散列图),没有带有父/子引用的花哨对象,没有ORM,没有框架,只有你的双手。该表表示为结果集,可以随机访问。


伪代码或普通英语是可以的,这纯粹是一个概念性的问题。


额外问题:在RDBMS中存储这样的树结构是否有根本更好的方法?


慕森王
浏览 517回答 3
3回答

元芳怎么了

从Oracle 9i开始,您可以使用CONNECT BY。SELECT LPAD(' ', (LEVEL - 1) * 4) || "Name" AS "Name"FROM (SELECT * FROM TMP_NODE ORDER BY "Order")CONNECT BY PRIOR "Id" = "ParentId"START WITH "Id" IN (SELECT "Id" FROM TMP_NODE WHERE "ParentId" = 0)从SQL Server 2005开始,您可以使用递归公用表表达式(CTE)。WITH [NodeList] (  [Id]  , [ParentId]  , [Level]  , [Order]) AS (  SELECT [Node].[Id]    , [Node].[ParentId]    , 0 AS [Level]    , CONVERT([varchar](MAX), [Node].[Order]) AS [Order]  FROM [Node]  WHERE [Node].[ParentId] = 0  UNION ALL  SELECT [Node].[Id]    , [Node].[ParentId]    , [NodeList].[Level] + 1 AS [Level]    , [NodeList].[Order] + '|'      + CONVERT([varchar](MAX), [Node].[Order]) AS [Order]  FROM [Node]    INNER JOIN [NodeList] ON [NodeList].[Id] = [Node].[ParentId]) SELECT REPLICATE(' ', [NodeList].[Level] * 4) + [Node].[Name] AS [Name]FROM [Node]  INNER JOIN [NodeList] ON [NodeList].[Id] = [Node].[Id]ORDER BY [NodeList].[Order]两者都将输出以下结果。名称'节点1''节点1.1''节点1.1.1''节点1.2''节点2''节点2.1'
随时随地看视频慕课网APP

相关分类

MySQL
我要回答