Без более конкретного определения проблемы трудно оказать хорошую помощь.Тем не менее, кажется, что вы на полпути, если вы можете сосчитать левые записи.
Вместо того, чтобы считать левые записи, попробуйте подсчитать обе стороны.Psuedo-код для этого выглядит примерно так:
public static int leafCount(Node node) {
if (node == null) {
return 0;
}
return 1 + leafCount(node.left) + leafCount(node.right);
}
Если какой-либо используемый вами язык бэкэнда имеет библиотеку для древовидной структуры, я бы ожидал, что подобная функция уже предусмотрена.
РЕДАКТИРОВАТЬ:
После выявления, что у нас действительно есть древовидная структура таблицы, с возможностью запроса в SQL -
Таблица:
CREATE TABLE RECURSE (ID INT NOT NULL WITH DEFAULT,
R_SIDE INT NOT NULL WITH DEFAULT,
L_SIDE INT NOT NULL WITH DEFAULT)
Данные:
INSERT INTO RECURSE VALUES (1, 2, 5)
(2, 3, 4)
(3, 0, 0)
(4, 0, 0)
(5, 0, 0)
Результирующая настройка:
Id R_Side L_Side
1 2 5
2 3 4
3 0 0
4 0 0
5 0 0
Этот оператор должен возвращать количество левого и правого узлов.По крайней мере, в DB2 кажется, что существуют ограничения, которые затрудняют использование left join
внутри рекурсивных CTE, поэтому вам приходится считать левую и правую стороны отдельно.Используйте это как отправную точку, если это не совсем соответствует вашим потребностям.
WITH left_side (id, count) as (SELECT id, 0
FROM recurse
WHERE L_Side = 0
UNION ALL
SELECT a.id, 1 + b.count
FROM recurse as a
JOIN left_side as b
ON b.id = a.l_side
where a.l_side > 0),
right_side (id, count) as (SELECT id, 0
FROM recurse
WHERE R_Side = 0
UNION ALL
SELECT a.id, 1 + b.count
FROM recurse as a
JOIN right_side as b
ON b.id = a.R_Side
where a.l_side > 0)
SELECT a.id, COALESCE(b.count, 0) + COALESCE(c.count, 0) as LeafCount
FROM recurse as a
LEFT JOIN right_side as b
ON b.id = a.id
LEFT JOIN left_side as c
ON clid = a.id
Выход:
Id LeafCount
1 3
2 2
3 0
4 0
5 0