在sql server 2008 r2中计算二叉树中的左右子计数

时间:2011-10-18 14:12:06

标签: sql-server binary-tree

我在sql server 2008 r2中以下列形式实现了二叉树

表二进制信息

父ID ---- LeftChildID ---- RightChildID

1 -------------- 2 -------------- 3

2 -------------- 4 --------------- 5

3 -------------- ---------------- 6 7

      1(Root)    
  2   |    3     
4   5 |  6   7

等等。现在我必须计算一个成员左侧和右侧的总成员数,例如1有3个左子女和3个右孩子。 2有1个左孩子和1个右孩子。

我可以在c#中这样做但是有没有办法在使用Procs或Functions的sql server中执行此操作?

我无法使用heirarchyid,因为此表中已填充了数据。

P.S 需要单独计算,即完全留下的孩子和总的右孩子。

2 个答案:

答案 0 :(得分:2)

您可以创建一个这样的递归过程:

CREATE PROCEDURE BinaryTreeCount
    @ParentId int,
    @HowMany int OUTPUT
as
BEGIN
    DECLARE @childenCount int
    SET @childenCount = 0
    SET @HowMany = 0

    SET @LeftChildId = null
    SET @RightChildId = null

    SELECT @LeftChildId = LeftChildID
         , @RightChildId = RightChildID
      FROM yourTableName
     WHERE ParendId = @ParentId

    if (@LeftChildId is not null) begin
        @howMany = @howMany + 1
        exec BinaryTreeCount @ParentId = @LeftChildId
                           , @HowMany  = @childenCount OUTPUT
        @howMany = @howMany + @childenCount
    end 

    if (@RightChildId is not null) begin
        @howMany = @howMany + 1
        exec BinaryTreeCount @ParentId = @RightChildId
                           , @HowMany  = @childenCount OUTPUT
        @howMany = @howMany + @childenCount
    end 
END

这只是一个想法,我还没有测试过。

答案 1 :(得分:1)

由于您使用的是SQL 2008,我很确定您可以使用递归CTE(公用表表达式)执行此操作:http://msdn.microsoft.com/en-us/library/ms186243.aspx

如果没有我面前的SQL副本,我很难显示我害怕的代码。