По сути, эту проблему можно решить с помощью динамического программирования на дереве, чтобы избежать этих перекрывающихся путей.
Основная идея состоит в том, чтобы отслеживать возможные длины от каждого листа до данного узла в таблице f[node]
. Если мы реализуем его в двумерном логическом массиве, это будет что-то вроде f[node][len]
, которое указывает, существует ли путь от листа до node
с длиной, равной len
. Мы также можем использовать vector<int>
для хранения значения в каждом f[node]
вместо использования логического массива. Независимо от того, какое представление вы используете, способ вычисления между различными f
будет простым, в виде
f[node] is the union of f[node->left] + len_left[node] and f[node->right] + len_right[node].
Это случай двоичного дерева, но действительно легко распространить его на случаи не двоичного дерева.
Если что-то неясно, пожалуйста, не стесняйтесь комментировать.