Advertisement
Guest User

Untitled

a guest
Apr 4th, 2020
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function BinaryTree(value, left = null, right = null) { // Деревом, по сути, будет узел со сзначением и двумя детьми, которые по дефолту null
  2.     return function(){
  3.         let getValue = () => value;
  4.         let getLeft = () => left;
  5.         let getRight = () => right;
  6.         let setLeft = (subTree) => left = subTree;
  7.         let setRight = (subTree) => right = subTree;
  8.         let set = (x) => {
  9.             if (getValue() === x) {
  10.                 return;
  11.             }
  12.             if (x < getValue()) {
  13.                 if (getLeft() !== null) {
  14.                     return getLeft().set(x);
  15.                 } else {
  16.                     setLeft(new BinaryTree(x));
  17.                     return;
  18.                 }
  19.             } else {
  20.                 if (getRight() !== null) {
  21.                     return getRight().set(x);
  22.                 } else {
  23.                     setRight(new BinaryTree(x));
  24.                     return;
  25.                 }
  26.             }
  27.         };
  28.         return{
  29.             getValue: getValue,
  30.             getLeft: getLeft,
  31.             getRight: getRight,
  32.             set: set
  33.         };
  34.     }();
  35. }
  36.  
  37. let treee = new BinaryTree(4);
  38. console.log(treee.getValue());
  39. treee.set(6);
  40. console.log(treee.toString());
  41.  
  42. BinaryTree.prototype.toString = function () {  // Если имеются дети, то есть они не null'ы, то мы добавляем их к выводу
  43.     let leftPart = this.getLeft() === null ? "" : (this.getLeft().toString() + ' '); // Пробелы добавляем на этом этапе, а не на этапе return'а, шобы не было лишних пробелов при отсутствии детей
  44.     let rightPart = this.getRight() === null ? "" : (' ' + this.getRight().toString());
  45.     return leftPart + this.getValue() + rightPart; // В чём идея: часто бинарные деревья являются деревьсями поиска, так что
  46.     // значение в левом ребёнке < значение в родителе < значение в правом ребёнке
  47.     // Если нас попросят нати х, то мы смотрим в узел, если не совпадает, то сравниваем
  48.     // если х меньше значения в узле, обращаемся к левому ребёнку, иначе - к правому.
  49.     // Так вот. Если иходить из того, что дерево имеет такой вид, то данный способ выведет значения в дереве в отсортированном порядке
  50.     // Я хз, чё именно в этом задании хочут
  51. };
  52.  
  53. function printTree(binaryTree, depth = 0) { // Эта версия отражает иерархию. Глубина имеет дефолтное значение, которое ей присвоится, если мы не передадим другое
  54.     let dots = ""; // Мне кажется, точки маленько помогут осознать, кто чей ребёнок
  55.     for (let i = 0; i < depth; i++) {
  56.         dots += '.';
  57.     }
  58.     console.log(dots, binaryTree.getValue()); //Сначала печатаем родителя, а потом двух детей
  59.     if (binaryTree.getLeft() !== null) printTree(binaryTree.getLeft(), depth + 1); // Тут не уверен в правильности проверки на undefined
  60.     if (binaryTree.getRight() !== null) printTree(binaryTree.getRight(), depth + 1);
  61. }
  62.  
  63. function printTree1(binaryTree) {
  64.     console.log(binaryTree.toString());
  65. }
  66.  
  67. // Пример использования кода:
  68. let tree =
  69. new BinaryTree(7,
  70.      new BinaryTree(4,
  71.         new BinaryTree(2),
  72.         new BinaryTree(6)),
  73.     new BinaryTree(11)
  74.     );
  75.  
  76. tree.set(17);
  77. // Тут как раз дерево поиска, шоб продемонстрировать отсортированность вывода
  78. /*
  79.                 7
  80.               /  \
  81.              4    11
  82.            /  \
  83.           2    6
  84.  */
  85. printTree(tree);
  86. printTree1(tree);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement