Ваша задача — разобраться с несколькими структурами данных, чтобы решить подзадачи. Описания подзадач, а также инструкции по запуску тестов и отправке решений находятся ниже.
Бинарное дерево — это иерархическая структура данных, в которой каждый узел имеет значение (оно же является в данном случае и ключом) и ссылки на левого и правого потомка. Узел, находящийся на самом верхнем уровне (не являющийся чьим либо потомком) называется корнем. Узлы, не имеющие потомков, называются листьями.
Бинарное дерево поиска — это бинарное дерево, обладающее дополнительными свойствами: значение левого потомка меньше значения родителя, а значение правого потомка больше значения родителя для каждого узла дерева. То есть, данные в бинарном дереве поиска хранятся в отсортированном виде. При каждой операции вставки нового или удаления существующего узла отсортированный порядок дерева сохраняется. При поиске элемента сравнивается искомое значение с корнем. Если искомое больше корня, то поиск продолжается в правом потомке корня, если меньше, то в левом, если равно, то значение найдено и поиск прекращается.
Ваша задача — реализовать класс BinarySearchTree
.
Каждый экземпляр BinarySearchTree
должен обладать следующими методами:
root
— возвращает корневой узел дереваadd(data)
— добавляет узел сdata
к деревуhas(data)
— возвращаетtrue
, если узел сdata
имеется в дереве иfalse
, если нетfind(data)
— возвращает узел сdata
, если узел сdata
имеется в дереве иnull
, если нетremove(data)
— удаляет узел сdata
из дерева, если узел сdata
имеется в деревеmin
— возвращает минимальное значение, хранящееся в дереве (илиnull
, если у дерева нет узлов)max
— возвращает максимальное значение, хранящееся в дереве (илиnull
, если у дерева нет узлов)
Например:
const tree = new BinarySearchTree();
tree.add(1);
tree.add(2);
tree.add(3);
tree.add(4);
tree.add(5);
tree.root().data
=> 1;
tree.min()
=> 1
tree.max()
=> 5
tree.remove(5);
tree.has(5)
=> false
tree.max()
=> 4
Напишите свой код в src/binary-search-tree.js
.
Дан односвязный связный список целых чисел (l
) и целое число (k
), удалите все элементы из списка l
, содержащие значение k
.
Например, для l
= [3, 1, 2, 3, 4, 5]
и k
= 3
,
результат будет [1, 2, 4, 5]
Узлы односвязного связного списка определяются интерфейсом:
function ListNode(x) {
this.value = x;
this.next = null;
}
Напишите свой код в src/st-remove-from-list.js
.
Реализуйте стек с заданным интерфейсом на основе массива.
Например:
const stack = new Stack();
stack.push(1); // добавляет элемент в стек
stack.peek(); // возвращает верхний элемент, но не удаляет его, возвращает 1
stack.pop(); // возвращает верхний элемент и удаляет его, возвращает 1
stack.pop(); // undefined
Напишите свой код в src/st-stack.js
.
Реализуйте очередь с заданным интерфейсом на основе связного списка (используйте ListNode
, расположенный в папке extensions
).
Каждый экземпляр очереди должен иметь 3 метода:
* enqueue(value)
— помещает value
в конец очереди
* deque
— извлекает значение с начала очереди и удаляет его
* getUnderlyingList
- возвращает связный список, лежащий в основе данной очереди
Например:
const queue = new Queue();
queue.enqueue(1); // добавляет элемент в очередь
queue.enqueue(3); // добавляет элемент в очередь
queue.dequeue(); // возвращает элемент из начала очереди и удаляет его, возвращает 1
queue.getUnderlyingList() // возвращает { value: 3, next: null }
Напишите свой код в src/st-queue.js
.
- Установите Node.js
- Сделайте форк этого репозитория: https://github.com/AlreadyBored/basic-js-ds
- Склонируйте себе этот репозиторий: https://github.com/<%your_github_username%>/basic-js-ds/
- Перейдите в папку
basic-js-ds
- Вбейте в командную строку
npm install
для установки зависимостей - Выполните
npm run test
в командой строке. - Вы увидите число ожидающих (pending), проходящих и падающих тестов. 100% проходящие тесты сооветствуют максимальному баллу за задание.
Отправка в rs app
- Откройте rs app и залогиньтесь
- Перейдите на страницу отправки задания
- Выберите задание (BasicJS Data Structures)
- Нажмите кнопку "Submit"
- Рекомендуется использовать 12.x.x LTS версию Node.js. Если вы используете фичи, которые не поддерживаются 12 версией, могут быть проблемы с автопроверкой задания.
- Перед отправкой результата убедитесь, что каждый ваш тест проходит не более чем за 30 секунд.
© AlreadyBored
& задачи с префиксом st-
интегрированы из Short track 2021 repo
& Thanks mikhama for assistance!