Files
freeCodeCamp/curriculum/challenges/ukrainian/10-coding-interview-prep/data-structures/check-if-an-element-is-present-in-a-binary-search-tree.md

176 lines
6.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
id: 587d8257367417b2b2512c7c
title: Перевірка наявності елементу у двійковому дереві пошуку
challengeType: 1
forumTopicId: 301623
dashedName: check-if-an-element-is-present-in-a-binary-search-tree
---
# --description--
Тепер, коли ми маємо загальне уявлення про двійкове дерево пошуку, поговорімо про нього більш детально. Двійкове дерево пошуку забезпечує логарифмічний час для виконання таких загальних операцій, як пошук, додавання і видалення, в середньому випадку складності та лінійний час у найгіршому випадку. Чому ж це так? Кожна з цих базових операцій передбачає знаходження елемента в дереві (або під час вставляння елемента - пошуку його місця в дереві). Деревоподібна структура є причиною того, що на кожному батьківському вузлі є ліве та праве розгалуження, а це дозволяє нам практично виключити з розгляду половину дерева, що залишилося. Як наслідок, пошук є пропорційним логарифму кількості вузлів в дереві, що забезпечує логарифмічний час виконання цих операцій у середньому випадку. А як тоді щодо найгіршого випадку? Що ж, розгляньте можливість створення дерева з таких значень, додаючи їх зліва направо: `10` `12`, `17`, `25`. Відповідно до правил двійкового дерева пошуку, ми додамо `12` праворуч від `10`, `17` праворуч від них і наостанок `25` - також праворуч. Тепер наше дерево нагадує зв'язаний список, і знаходження в ньому числа `25` передбачатиме лінійний обхід усіх елементів. Таким чином, у найгіршому випадку - лінійний час. Проблема тут в тому, що дерево не збалансоване. Ми розглянемо це детальніше в наступних завданнях.
# --instructions--
У цьому завданні ми створимо сервісну програму для нашого дерева. Напишіть метод `isPresent`, який приймає ціле число як вхідне значення і повертає логічне значення для наявності або відсутності цього значення у двійковому дереві пошуку.
# --hints--
Повинна існувати структура даних `BinarySearchTree`.
```js
assert(
(function () {
var test = false;
if (typeof BinarySearchTree !== 'undefined') {
test = new BinarySearchTree();
}
return typeof test == 'object';
})()
);
```
Двійкове дерево пошуку повинне мати метод під назвою `isPresent`.
```js
assert(
(function () {
var test = false;
if (typeof BinarySearchTree !== 'undefined') {
test = new BinarySearchTree();
} else {
return false;
}
return typeof test.isPresent == 'function';
})()
);
```
Метод `isPresent` повинен правильно перевіряти наявність або відсутність елементів, доданих дерева.
```js
assert(
(function () {
var test = false;
if (typeof BinarySearchTree !== 'undefined') {
test = new BinarySearchTree();
} else {
return false;
}
if (typeof test.isPresent !== 'function') {
return false;
}
test.add(4);
test.add(7);
test.add(411);
test.add(452);
return (
test.isPresent(452) &&
test.isPresent(411) &&
test.isPresent(7) &&
!test.isPresent(100)
);
})()
);
```
Метод `isPresent` повинен також опрацьовувати випадки, коли дерево є порожнім.
```js
assert(
(function () {
var test = false;
if (typeof BinarySearchTree !== 'undefined') {
test = new BinarySearchTree();
} else {
return false;
}
if (typeof test.isPresent !== 'function') {
return false;
}
return test.isPresent(5) == false;
})()
);
```
# --seed--
## --after-user-code--
```js
BinarySearchTree.prototype = Object.assign(
BinarySearchTree.prototype,
{
add: function(value) {
var node = this.root;
if (node == null) {
this.root = new Node(value);
return;
} else {
function searchTree(node) {
if (value < node.value) {
if (node.left == null) {
node.left = new Node(value);
return;
} else if (node.left != null) {
return searchTree(node.left);
}
} else if (value > node.value) {
if (node.right == null) {
node.right = new Node(value);
return;
} else if (node.right != null) {
return searchTree(node.right);
}
} else {
return null;
}
}
return searchTree(node);
}
}
}
);
```
## --seed-contents--
```js
var displayTree = tree => console.log(JSON.stringify(tree, null, 2));
function Node(value) {
this.value = value;
this.left = null;
this.right = null;
}
function BinarySearchTree() {
this.root = null;
// Only change code below this line
// Only change code above this line
}
```
# --solutions--
```js
var displayTree = (tree) => console.log(JSON.stringify(tree, null, 2));
function Node(value) {
this.value = value;
this.left = null;
this.right = null;
}
function BinarySearchTree() {
this.root = null;
this.isPresent = function (value) {
var current = this.root
while (current) {
if (value === current.value) {
return true;
}
current = value < current.value ? current.left : current.right;
}
return false;
}
}
```