[英]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.