TGViewer
PHP | LeetCode PHP | LeetCode @easy_php_task · 1.33K subscribers
Post #859 158
Задача: 103. Binary Tree Zigzag Level Order Traversal
Сложность: medium

Дан корень бинарного дерева. Верните обход узлов дерева по уровням в виде зигзага (то есть слева направо, затем справа налево для следующего уровня и чередуйте далее).

Пример:
Input: root = [3,9,20,null,null,15,7]
Output: [[3],[20,9],[15,7]]


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

1⃣Мы также можем реализовать поиск в ширину (BFS) с использованием одного цикла. Трюк заключается в том, что мы добавляем узлы для посещения в очередь, а узлы разных уровней разделяем с помощью какого-то разделителя (например, пустого узла). Разделитель отмечает конец уровня, а также начало нового уровня.

2⃣Здесь мы принимаем второй подход, описанный выше. Можно начать с обычного алгоритма BFS, к которому мы добавляем элемент порядка зигзага с помощью deque (двусторонней очереди).

3⃣Для каждого уровня мы начинаем с пустого контейнера deque, который будет содержать все значения данного уровня. В зависимости от порядка каждого уровня, т.е. либо слева направо, либо справа налево, мы решаем, с какого конца deque добавлять новый элемент.

😎 Решение:
class TreeNode {
public $val;
public $left;
public $right;

public function __construct($val, $left = null, $right = null) {
$this->val = $val;
$this->left = $left;
$this->right = $right;
}
}

class Solution {
function zigzagLevelOrder($root) {
$result = [];
if ($root === null) {
return $result;
}

$nodeQueue = new SplQueue();
$nodeQueue->enqueue($root);
$nodeQueue->enqueue(null);
$isOrderLeft = true;
$levelList = [];

while (!$nodeQueue->isEmpty()) {
$currentNode = $nodeQueue->dequeue();

if ($currentNode !== null) {
if ($isOrderLeft) {
$levelList[] = $currentNode->val;
} else {
array_unshift($levelList, $currentNode->val);
}

if ($currentNode->left !== null) {
$nodeQueue->enqueue($currentNode->left);
}
if ($currentNode->right !== null) {
$nodeQueue->enqueue($currentNode->right);
}
} else {
$result[] = $levelList;
$levelList = [];
if (!$nodeQueue->isEmpty()) {
$nodeQueue->enqueue(null);
}
$isOrderLeft = !$isOrderLeft;
}
}

return $result;
}
}


Ставь 👍 и забирай 📚 Базу знаний
More from @easy_php_task
  1. Oct 16, 2026Задача: 760. Find Anagram Mappings Сложность: easy Вам даны два целочисленных массива nums…
  2. Oct 15, 2026Задача: 474. Ones and Zeroes Сложность: medium Дан массив двоичных строк strs и два целых…
  3. Oct 15, 2026Задача: 1273. Delete Tree Nodes Сложность: medium Дерево, укорененное в узле 0, задано сле…
  4. Oct 14, 2026Задача: 724. Find Pivot Index Сложность: easy Если задан массив целых чисел nums, вычислит…
  5. Oct 14, 2026Задача: 674. Longest Continuous Increasing Subsequence Сложность: easy Дан неотсортированн…
  6. Oct 13, 2026Задача: 899. Orderly Queue Сложность: hard Вам дана строка s и целое число k. Вы можете вы…
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 →