Рубрики
Без рубрики

Решение: Двоичное обход на уровне деревьев

Это является частью серии пояснений решения LeetCode (индекс). Если вам понравилось это решение или Фу … помечены алгоритмами, JavaScript, Java, Python.

Решения LeetCode (161 часть серии)

Это является частью серии объяснений решения LeetCode ( index ). Если вам понравилось это решение или нашел его полезным, Пожалуйста, как этот пост и/или УПОТАТЬ Мое решение пост на форумах LeetCode Отказ

Проблема лецкода № 102 (средний): Двоичный порядок на уровне деревьев

Описание:

( Перейти к : Идея решения Код : JavaScript | Python |. Java |. C ++

Учитывая root бинарного дерева, возврат Уровень заказа обходных ценностей узлов Отказ (то есть, слева направо, уровень на уровне).

Примеры:

Вход: root = [ 3,9,20, NULL, NULL, 15,7]
Выход: [[3],[9,20],[15,7]]
Визуальный
Вход: root = [1]
Выход: [[1]]
Вход: root = []
Выход: []

Ограничения:

  • Количество узлов в дереве находится в диапазоне [0, 2000] .
  • -1000.val.

Идея:

( Перейти к : Описание проблемы Код : JavaScript | Python |. Java |. C ++

Обход заказа на уровне двоичного дерева обычно рекомендует Ширина первого поиска ( BFS ) Подход с использованием очередь структура данных. Когда мы обрабатываем узел ( Curry ), мы вытащим детей узла на конец очередь В том порядке, в котором мы хотим пройти (в этом случае, слева направо). Таким образом, мы закончили положить следующий ряд в очередь В то же время мы закончим итерацию через эту строку.

Чтобы помочь нам отслеживать строки, мы просто устанавливаем основной петлю внутри другой петли. В начале внешней петли мы захватываем очередь Длина, которая скажет нам, как долго ряд. Тогда мы можем повторить это много узлов, выскакивая их очередь Фронт по одному за раз, затем обрабатывать любые инструкции с концами. В случае этой проблемы, которая будет означать нажатие текущего массива строки ( row ) на наш массив ответов ( ANS ).

Мы продолжим этот процесс до тех пор, пока очередь пусто, в какой момент мы достигли конца бинарного дерева, а может Вернуть АНС .

  • Сложность времени: O (n) куда N количество узлов в бинарном дереве
  • Космическая сложность: O (n) для нашего ответа

Код JavaScript:

( Перейти к : Описание проблемы Идея решения

var levelOrder = function(root) {
    let q = [root], ans = []
    while (q[0]) {
        let qlen = q.length, row = []
        for (let i = 0; i < qlen; i++) {
            let curr = q.shift()
            row.push(curr.val)
            if (curr.left) q.push(curr.left)
            if (curr.right) q.push(curr.right)
        }
        ans.push(row)            
    }
    return ans
};

Код Python:

( Перейти к : Описание проблемы Идея решения

class Solution:
    def levelOrder(self, root: TreeNode) -> List[List[int]]:
        queue, ans = deque([root] if root else []), []
        while len(queue):
            qlen, row = len(queue), []
            for _ in range(qlen):
                curr = queue.popleft()
                row.append(curr.val)
                if curr.left: queue.append(curr.left)
                if curr.right: queue.append(curr.right)
            ans.append(row)
        return ans

Java код:

( Перейти к : Описание проблемы Идея решения

class Solution {
    public List> levelOrder(TreeNode root) {
        List> ans = new ArrayList<>();
        if (root == null) return ans;
        Deque queue = new ArrayDeque<>();
        queue.add(root);
        while (!queue.isEmpty()) {
            int qlen = queue.size();
            List row = new ArrayList<>();
            for (int i = 0; i < qlen; i++) {
                TreeNode curr = queue.poll();
                row.add(curr.val);
                if (curr.left != null) queue.add(curr.left);
                if (curr.right != null) queue.add(curr.right);
            }
            ans.add(row);
        }
        return ans;
    }
}

C ++ код:

( Перейти к : Описание проблемы Идея решения

class Solution {
public:
    vector> levelOrder(TreeNode* root) {
        vector> ans;
        if (!root) return ans;
        deque queue;
        queue.push_back(root);
        while (!queue.empty()) {
            int qlen = queue.size();
            vector row;
            for (int i = 0; i < qlen; i++) {
                TreeNode* curr = queue.front();
                queue.pop_front();
                row.push_back(curr->val);
                if (curr->left) queue.push_back(curr->left);
                if (curr->right) queue.push_back(curr->right);
            }
            ans.push_back(row);
        }
        return ans;
    }
};

Решения LeetCode (161 часть серии)

Оригинал: “https://dev.to/seanpgallivan/solution-binary-tree-level-order-traversal-36cg”