簡體   English   中英

二叉樹統計左側和右側的所有子節點

[英]Binary tree count all child nodes in left and right side

                                     1
                                   /   \
                                 2       3
                                / \     / \
                               4   5   6   7
                             /      \       \
                           8          9      11
                          /                   \
                        10                      12
                       /  \
                     13    14

我有一個這樣的二叉樹。 這里,1 是父母,我想計算 1 左右兩側的所有孩子

我有以下 mysql 表結構

**id** **amount** **left** **right**
  1       3000       2        3
  2       3000       4        5
  3       750        6        7
  4       750        8      *null*
  5       3000    *null*      9
  6       750     *null*    *null*
  7       750     *null*      11
  8       750       10      *null*
  9       3000    *null*    *null*
 10       3000      13        14
 11       750     *null*      12
 12       3000    *null*    *null*  
 13       750     *null*    *null*
 14       3000    *null*    *null*
        

現在我想根據 ID 的計划數量計算所有左側節點和右側節點,盡管我有數千個數據。 是否可以通過計划數量區分所有節點來計算所有節點? 例如,如果 ID 2 在其左側包含 5 個 ID( 4, 8, 10, 13, 14 )並且每個 ID 的計划數量不同,我可以計算 750 計划中有多少個 2 以下的 ID 嗎? 使用 php

小提琴

CREATE PROCEDURE count_nodes (IN id INT, IN amount INT)
BEGIN
CREATE TABLE temp (id INT PRIMARY KEY, amount INT, id_left INT, id_right INT, side INT);
INSERT INTO temp SELECT *, 0 FROM test WHERE test.id = id;
REPEAT
    INSERT IGNORE INTO temp
    SELECT test.*, CASE WHEN test.id = temp.id_left THEN 1 ELSE 2 END FROM test JOIN temp ON test.id IN (temp.id_left, temp.id_right);
UNTIL NOT ROW_COUNT() END REPEAT;
SELECT SUM(side=1) left_childs, SUM(side=2) right_childs FROM temp WHERE temp.amount = amount;
DROP TABLE temp;
END

小提琴

如果在id的子樹中沒有與起始id或提供的amount匹配的行,則該過程將返回 NULL。

該過程是循環安全的(不會導致錯誤源表數據的無限循環)。 但是對於id_left = id_right錯誤數據是id_left = id_right - 這樣的錯誤節點將被計為左節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM