TGViewer
PHP | LeetCode PHP | LeetCode @easy_php_task · 1.33K subscribers
Post #937 154
Задача: 1530. Number of Good Leaf Nodes Pairs
Сложность: medium

Вам дан корень бинарного дерева и целое число distance. Пара двух различных листовых узлов бинарного дерева называется хорошей, если длина кратчайшего пути между ними меньше или равна distance.

Верните количество хороших пар листовых узлов в дереве.

Пример:
Input: root = [1,2,3,null,4], distance = 3
Output: 1
Explanation: The leaf nodes of the tree are 3 and 4 and the length of the shortest path between them is 3. This is the only good pair.


👨‍💻 Алгоритм:

1⃣Инициализируйте список смежности для преобразования дерева в граф и множество для хранения листовых узлов. Используйте вспомогательный метод traverseTree для обхода дерева, чтобы построить граф и найти листовые узлы. В параметрах поддерживайте текущий узел, а также родительский узел. Если текущий узел является листом, добавьте его в множество. В списке смежности добавьте текущий узел в список соседей родительского узла и наоборот. Рекурсивно вызовите traverseTree для левого и правого дочернего узла текущего узла.

2⃣Инициализируйте переменную ans для подсчета количества хороших пар листовых узлов. Итеративно переберите каждый листовой узел в множестве. Запустите BFS для текущего листового узла. BFS можно прервать досрочно, как только будут обнаружены все узлы, находящиеся на расстоянии от текущего листового узла. Увеличьте ans для каждого листового узла, найденного в каждом запуске BFS.

3⃣Верните ans / 2. Мы считаем каждую пару дважды, поэтому нужно разделить на 2, чтобы получить фактическое количество.

😎 Решение:
class Solution {
function countPairs($root, $distance) {
$graph = [];
$leafNodes = new SplObjectStorage();
$this->traverseTree($root, null, $graph, $leafNodes);
$ans = 0;
foreach ($leafNodes as $leaf) {
$bfsQueue = new SplQueue();
$seen = new SplObjectStorage();
$bfsQueue->enqueue($leaf);
$seen->attach($leaf);
for ($i = 0; $i <= $distance; $i++) {
$size = $bfsQueue->count();
for ($j = 0; $j < $size; $j++) {
$currNode = $bfsQueue->dequeue();
if ($leafNodes->contains($currNode) && $currNode !== $leaf) {
$ans++;
}
if (isset($graph[spl_object_hash($currNode)])) {
foreach ($graph[spl_object_hash($currNode)] as $neighbor) {
if (!$seen->contains($neighbor)) {
$bfsQueue->enqueue($neighbor);
$seen->attach($neighbor);
}
}
}
}
}
}
return $ans / 2;
}

private function traverseTree($currNode, $prevNode, &$graph, $leafNodes) {
if ($currNode === null) {
return;
}
if ($currNode->left === null && $currNode->right === null) {
$leafNodes->attach($currNode);
}
if ($prevNode !== null) {
$graph[spl_object_hash($prevNode)][] = $currNode;
$graph[spl_object_hash($currNode)][] = $prevNode;
}
$this->traverseTree($currNode->left, $currNode, $graph, $leafNodes);
$this->traverseTree($currNode->right, $currNode, $graph, $leafNodes);
}
}


Ставь 👍 и забирай 📚 Базу знаний
  • 👍 1
  • 🔥 1
More from @easy_php_task
  1. Oct 17, 2026Задача: 1302. Deepest Leaves Sum Сложность: medium Дано корень бинарного дерева, вернуть с…
  2. Oct 16, 2026Задача: 760. Find Anagram Mappings Сложность: easy Вам даны два целочисленных массива nums…
  3. Oct 15, 2026Задача: 474. Ones and Zeroes Сложность: medium Дан массив двоичных строк strs и два целых…
  4. Oct 15, 2026Задача: 1273. Delete Tree Nodes Сложность: medium Дерево, укорененное в узле 0, задано сле…
  5. Oct 14, 2026Задача: 724. Find Pivot Index Сложность: easy Если задан массив целых чисел nums, вычислит…
  6. Oct 14, 2026Задача: 674. Longest Continuous Increasing Subsequence Сложность: easy Дан неотсортированн…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →