【问题标题】:Get root, inner, and leaf nodes from a table?从表中获取根节点、内部节点和叶节点?
【发布时间】:2017-05-01 09:42:50
【问题描述】:

给定一个节点表(它们的 Id 和它们的父 Id),我如何获取所有根节点、内部节点和叶节点?

这是我目前所拥有的:

根节点

SELECT Id, "Root" FROM NodeTable
WHERE ParentId IS NULL;

内部节点

???

叶节点

SELECT N1.Id, "Leaf" FROM NodeTable N1
LEFT JOIN NodeTable N2 ON N1.Id = N2.ParentId
WHERE N2.ParentId IS NULL;

这是正确的吗?有没有一种方法可以在一个查询中做到这一点?

【问题讨论】:

    标签: mysql binary-tree


    【解决方案1】:
    select  case 
            when p is null then concat(n, ' Root')
            when n in (select distinct p from bst) then concat(n, ' Inner')
            else concat(n, ' Leaf')
        end
    from bst
    order by n asc
    

    【讨论】:

    • 您可能需要详细说明此答案。指出原始代码有什么问题以及如何更改它。这将使它对未来的访问者更有用。
    【解决方案2】:

    您的“内部节点”查询可以类似于您的“叶节点”查询得出。

    SELECT DISTINCT N1.Id, "Inner"
    FROM NodeTable N1
    JOIN NodeTable N2
      ON N2.ParentId = N1.ID
    WHERE N1.ParentId IS NOT NULL;
    

    这将为您提供所有不是根节点的节点 (N1)(因为它们具有非空 ParentId)并且具有子节点 (N2)。

    是的,您可以使用UNION 关键字在一个查询中完成所有这些操作。

    SELECT Id, "Root" 
    FROM NodeTable
    WHERE ParentId IS NULL
    UNION
    SELECT DISTINCT N1.Id, "Inner"
    FROM NodeTable N1
    JOIN NodeTable N2
      ON N2.ParentId = N1.ID
    WHERE N1.ParentId IS NOT NULL
    UNION
    SELECT N1.Id, "Leaf" 
    FROM NodeTable N1
    LEFT JOIN NodeTable N2 
      ON N1.Id = N2.ParentId
    WHERE N2.ParentId IS NULL;
    

    【讨论】:

    • 太棒了,非常感谢!出于某种原因,当我自己运行您的内部查询时,每个节点都会出现两次。我对 MySQL 很陌生,你能帮我理解为什么会这样以及如何解决它吗?
    • 实际上,当我使用 Union 关键字时,这个问题就消失了。奇怪!
    • @IanMobbs Union 是一个集合运算符。因此,如果一行被查询两次,然后与某事物联合,则该行只会显示一次。
    • @IanMobbs 我已将查询更新为仅返回不同的行。您有重复项,因为(我想)它是一棵二叉树,因此 JOIN 为每个内部节点的每个子节点生成一行。
    【解决方案3】:

    更简洁的方式:

    SELECT 
        N, 
        IF(
            P IS NULL, 
            'Root', 
            IF(
                (
                    SELECT COUNT(*) 
                    FROM BST 
                    WHERE P=B.N
                ) > 0, 
               'Inner', 
               'Leaf'
           )
        ) 
    FROM BST AS B 
    ORDER BY N;
    

    SELECT 
        N, 
        IF(
            P IS NULL, 
            'Root', 
            IF(
                B.N IN (SELECT P FROM BST),
               'Inner', 
               'Leaf'
           )
        ) 
    FROM BST AS B 
    ORDER BY N;
    

    【讨论】:

      【解决方案4】:
      select n, (case when p is null then "Root" when n in (select p from bst) then "Inner" else "Leaf" end) from BST order by n;
      

      【讨论】:

        【解决方案5】:

        您的根叶逻辑似乎是正确的。内部通常是其他一切

        如果您想在 1 个 SQL 代码中执行此操作,那么您可以试试这个

        SELECT DISTINCT Id,
        CASE WHEN Id NOT IN (SELECT DISTINCT ParentId FROM NodeTable WHERE ParentId IS NOT NULL ) 
             THEN "Leaf"
              WHEN ParentId IS NULL THEN "Root"
              ELSE "Inner"
              END AS NodeType
        FROM NodeTable
        ORDER BY Id
        
        

        【讨论】:

          【解决方案6】:

          选择 n,大小写 当 p 为空时,'Root' 当 n in (select p from bst) 然后 'Inner' 否则'叶子' 结尾 从 bst 按 n 排序;

          【讨论】:

          • 添加一些带有 CODE 标签的示例 sql 查询
          【解决方案7】:

          短而高效

              SELECT N , CASE WHEN P is null THEN 'Root' ELSE 
             (IF (N IN (SELECT P FROM BST ), 'Inner','Leaf' ) ) END FROM BST ORDER BY N
          

          【讨论】:

            【解决方案8】:
            
                SELECT DISTINCT(N), 'Root' FROM BST WHERE P IS NULL UNION 
                SELECT DISTINCT(N), 'Leaf' FROM BST WHERE N NOT IN (SELECT 
                DISTINCT(P) FROM BST WHERE P IS NOT NULL) UNION 
                SELECT DISTINCT(N), 'Inner' FROM BST WHERE N IN (SELECT 
                DISTINCT(P) FROM BST) AND P IS NOT NULL;
            
            
            WHERE   
            Root= Parent is null,  
            leaf= when a Particular node is not a parent for any node,  
            Inner= when a Particular node is a parent for any node
            

            【讨论】:

            • 没有解释的答案没有多大帮助。
            【解决方案9】:

            这是另一种选择:

            SELECT distinct N1.N,
              Case
                    When N1.P is null then 'Root'
                    When N2.P is null then 'Leaf'
                    Else 'Inner'
              End
            FROM BST N1
            LEFT JOIN BST N2 
              ON N1.N = N2.P
            ORDER BY N1.n
            

            【讨论】:

              【解决方案10】:
              select t.N,
              case  
                    when t.P is null then 'Root'
                    when t.N in (select t1.P from  BST t1 where t1.P = t.N) then 'Inner' 
                    else 'Leaf' 
              end
              from BST t
              order by t.N 
              

              【讨论】:

              • 只有一些代码行通常被认为没有用。您应该解释代码在做什么以及它如何或为什么解决问题或回答问题。
              【解决方案11】:

              select n,case when p in (select n from bst) then case when n in (select p from bst) then "Inner" else "Leaf" end else "Null" end from bst order by n ;

              【讨论】:

                【解决方案12】:

                我相信它来自这个链接:https://www.hackerrank.com/challenges/binary-search-tree-1/problem

                这是你可以做的!

                SELECT N, IF(P IS NULL, 'Root', IF((SELECT COUNT(*) FROM BST WHERE P=B.N)>0,'Inner','Leaf')) 
                FROM BST AS B 
                ORDER BY N;
                

                【讨论】:

                  【解决方案13】:

                  以下是我的解决方案:

                   select N,case when level=1 then 'Root'
                                 when connect_by_isleaf=1 then 'Leaf'
                                 when level>1 and connect_by_isleaf=0 then 'Inner' 
                            end
                   from BST
                   start with p is null
                   connect by p=prior N
                   order by N;
                  

                  【讨论】:

                    【解决方案14】:
                    Select distinct(N),x
                    from(
                    select N,P,
                    case when P is null and N is not null then 'Root'
                    when N in (Select distinct(P)from BST where P is not null) then 'Inner' 
                    else 'Leaf' end as x
                    from BST)a
                    order by N;
                    

                    【讨论】:

                    • 在回答一个老问题时,如果您包含一些上下文来解释您的答案如何提供帮助,那么您的答案将对其他 StackOverflow 用户更有用,特别是对于已经有一个已接受答案的问题。请参阅:How do I write a good answer
                    【解决方案15】:
                    select N, 'Root' from N1 where P is null
                    UNION
                    select N, 'Leaf'  from N1 where N not in (select P from N1 where p is not 
                                                               null) 
                    UNION
                    select N , 'Inner' from N1 where N  in 
                    (select P from N1 where p NOT IN (select N from N1 where P is null)) 
                    order by n;
                    

                    【讨论】:

                      【解决方案16】:

                      你也可以试试..

                      选择 N, B.p 为 NULL 然后为 'Root' 的情况 当 B.N IN(从 BST 中选择 p)然后 'Inner' 否则'叶子' 结束案例 从 BST B 按 N 排序;

                      【讨论】:

                        【解决方案17】:

                        你可以使用存在和不存在:

                        选择 N,“根” 来自 BST,其中 p 为空 联盟 选择 N,'叶子' 来自 BST 不存在的地方(从 BST b 中选择 * b.P =a.N ) 工会
                        选择 N,'内部' 来自 BST where exists (select * from BST b where b.P =a.N and a.P is not null);

                        【讨论】:

                          【解决方案18】:

                          选择 n ,当 p 为空时,则为 'Root' 当 n in (select distinct p from bst ) 然后 'Inner' else 'Leaf' 以 t 结尾

                          从 bst 按 1 排序;

                          【讨论】:

                            【解决方案19】:
                            SELECT N,CASE WHEN ISNULL(P,0) = 0 THEN 'Root'
                            WHEN N IN (SELECT P FROM BST ) THEN 'Inner'
                            ELSE 'Leaf'
                            END NODETYPE
                            FROM BST
                            ORDER BY N
                            
                            1. 检查 IF PARENT US NULL THEN ROOT
                            2. 如果节点在父列中,则为“内部”
                            3. ELSE '叶子'

                            【讨论】:

                              【解决方案20】:
                              select N, 'Root' from BST where P is null
                              UNION
                              select N, 'Leaf'  from BST where N not in (select P from BST where p is not 
                                                                     null) 
                              UNION
                              select N , 'Inner' from BST where N  in 
                              (select P from BST where p NOT IN (select N from BST where P is null)) 
                              order by n;
                              

                              【讨论】:

                              • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
                              【解决方案21】:

                              其他方式:

                              SELECT 
                              N, 
                              DECODE(P, NULL, 'Root', DECODE(N, (SELECT DISTINCT S.P FROM BST S WHERE S.P=B.N),'Inner', 'Leaf')) FROM BST B
                              ORDER BY N;
                              

                              【讨论】:

                              【解决方案22】:
                              select N, Case 
                              when P is null then 'Root' 
                              when N in (select P from BST) then 'Inner'
                              Else 'Leaf' end from BST order by N asc
                              

                              【讨论】:

                                猜你喜欢
                                • 1970-01-01
                                • 2013-01-01
                                • 2016-07-19
                                • 2023-03-09
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2012-06-07
                                相关资源
                                最近更新 更多