[{"data":1,"prerenderedAt":1115},["ShallowReactive",2],{"$fCudq6XtG6FYQaMS7Sww-inlMaeom2otb0U-pJZl5LW4":3,"$f-KhKwB8J0md5Q3U1oyqNCQbHxVpirjaanlJWCGo_ht4":104,"$fkVWEWXZHbLy86BhC78gDVDJ_00TY4k_DsdZD3Mz6ZO0":107,"$fqGwjmVbyPxmA5lnsLz9nF3m-ncS8WzLIlTsTA85cuZA":112,"$fVMSX_HWVzVkzv-u5ATHiOgClblPaIGZfXUn_Cq8LKn4":459,"$fw0tI3d-iV2W3zZtbRjyPNNRSgXGobrmwsMU7a1fynls":680,"mdc-5g3ii9-key":700,"mdc-h0a5hx-key":748,"mdc--jdgx0i-key":805,"mdc--vye7nm-key":887,"mdc--8bc3yh-key":926,"mdc-jhnugl-key":940,"mdc--mxtujb-key":988,"mdc--50o3nc-key":1035,"mdc-pydu50-key":1099},{"content":4,"livecodingContent":62,"type":92,"pageMeta":93},[5,9,13,17,20,24,27,31,34,38,41,45,48,52,56,59],{"id":6,"value":7,"isTypeH1":8},"1983","Дано дерево, необходимо найти сумму всех вершин",true,{"id":10,"value":11,"anchor":12,"isTypeH2":8},"4621","Теория и объяснение","theory-and-explanation",{"id":14,"value":15,"anchor":16,"isTypeH3":8},"4657","Что такое дерево в этой задаче","what-is-a-tree-here",{"id":18,"value":19,"isTypeParagraph":8},"10629","Каждый узел — это объект с числом `valueNode` и полем `next`, которое либо `null`, либо массив дочерних узлов.  \nСумма по дереву — это сумма значения текущего узла плюс суммы всех его потомков.\n\nУпрощённая схема (для первого примера):\n\n```\n(3)\n   /    /     \\      \\\n (1)  (3)     (2)     (2)\n                    /    \\\n                  (1)    (5)\n```\nСумма должна учитывать все числа в кружках.",{"id":21,"value":22,"anchor":23,"isTypeH3":8},"4658","Как мыслить рекурсивно","how-to-think-recursively",{"id":25,"value":26,"isTypeParagraph":8},"10630","Рекурсивная идея строится на том, что “часть дерева” (поддерево) имеет тот же формат, что и всё дерево.  \nОпределяется правило:\n\n- Если узла нет (`null` или `undefined`), сумма равна 0.\n- Если узел есть, сумма равна `node.valueNode + сумма всех детей`.\n\nВ коде часто выглядит так:\n- базовый случай: `if (root == null) return 0;`\n- рекурсивный шаг: суммирование детей через цикл или `reduce()`.",{"id":28,"value":29,"anchor":30,"isTypeH3":8},"4659","Зачем здесь reduce()","why-reduce-is-useful",{"id":32,"value":33,"isTypeParagraph":8},"10631","`reduce()` превращает массив в одно значение, “накапливая” результат в аккумуляторе.  \nВ задаче аккумулятором является сумма, которая увеличивается для каждого ребёнка.\n\nВажный момент для начинающих: если массив детей пустой, `reduce()` должен иметь корректное начальное значение аккумулятора. В рекурсивном решении начальное значение задано как `root.valueNode`, поэтому даже при пустом списке детей возвращается значение текущего узла.\n",{"id":35,"value":36,"anchor":37,"isTypeH3":8},"4660","Почему итерация спасает от переполнения стека","why-iteration-helps-with-stack",{"id":39,"value":40,"isTypeParagraph":8},"10632","Рекурсивный вызов функции создаёт новый кадр в стеке вызовов. Если глубина дерева слишком велика, стек заканчивается.  \nИтеративный обход хранит “что обработать дальше” в обычном массиве (стек/очередь), поэтому ограничение по глубине становится значительно мягче.",{"id":42,"value":43,"anchor":44,"isTypeH3":8},"4661","Корректная обработка next:null","handling-next-null-correctly",{"id":46,"value":47,"isTypeParagraph":8},"10633","Так как по условию `next` бывает `null`, требуется проверка перед обходом детей:\n- надёжно: `Array.isArray(node.next)`\n- допустимо и кратко: `const children = node.next ?? []`",{"id":49,"description":50,"titleAlert":51,"isTypeAlertInfo":8},"710","Optional chaining `?.` (например, `node.next?.length`) полезен, когда часть цепочки может быть `null`/`undefined`. Однако в данной задаче `Array.isArray(...)` даёт более строгую гарантию “это массив”, а не просто “что-то существует”.\n",null,{"id":53,"value":54,"anchor":55,"isTypeH3":8},"4662","Сложность алгоритмов (время и память)","time-and-memory-complexity",{"id":57,"value":58,"isTypeParagraph":8},"10634","Пусть `n` — количество узлов в дереве.\n- Время у всех решений: O(n), так как каждый узел посещается один раз.\n- Память:\n  - Рекурсивный DFS: O(h), где `h` — высота дерева (глубина), кадры лежат в стеке вызовов.\n  - Итеративный DFS: O(h) в худшем случае, элементы лежат в собственном стеке.\n  - BFS: O(w), где `w` — максимальная ширина уровня, элементы лежат в очереди.",{"id":60,"value":61,"isTypeParagraph":8},"10635","Кратко: сумма `valueNode` находится простым обходом всех узлов (O(n)): рекурсивный DFS — самый наглядный, но на глубоком дереве может упасть из-за стека; итеративный DFS/BFS решает ту же задачу без рекурсии и обычно надёжнее для больших глубин.",{"id":63,"functionTestData":64,"functionName":88,"functionTemplateCode":89,"solution":90,"description":91},"424",[65,81],[66,80],[67],{"next":68,"valueNode":72},[69,71,73,75],{"next":51,"valueNode":70},1,{"next":51,"valueNode":72},3,{"next":51,"valueNode":74},2,{"next":76,"valueNode":74},[77,78],{"next":51,"valueNode":70},{"next":51,"valueNode":79},5,17,[82,87],[83],{"next":84,"valueNode":70},[85,86],{"next":51,"valueNode":72},{"next":51,"valueNode":74},6,"sumVertices","function sumVertices(tree) {\n    // ваш код здесь\n}","**Вариант 1**: Рекурсивный DFS (самый понятный)\n\n```\nfunction sumVertices(root) {\n  if (root == null) return 0;\n\n  const children = Array.isArray(root.next) ? root.next : [];\n\n  return children.reduce((acc, child) => acc + sumVertices(child), root.valueNode);\n}\n```\n\nПри очень большой глубине дерева рекурсия может привести к ошибке переполнения стека вызовов (например, сообщения вида “Maximum call stack size exceeded” / “too much recursion”).\n\n**Вариант 2**: Итеративный DFS через стек (устойчиво к глубине)\n\nЭтот вариант делает то же самое, но без рекурсии: вместо стека вызовов движка используется собственный массив-стек.\n\n```\nfunction sumVertices(root) {\n  if (root == null) return 0;\n\n  let sum = 0;\n  const stack = [root];\n\n  while (stack.length > 0) {\n    const node = stack.pop();\n    sum += node.valueNode;\n\n    if (Array.isArray(node.next)) {\n      for (const child of node.next) {\n        stack.push(child);\n      }\n    }\n  }\n\n  return sum;\n}\n```\n\n**Вариант 3**: Итеративный BFS через очередь (по уровням)\n\nУдобно, если требуется обход “сверху вниз по уровням” (для суммы порядок не важен, но метод полезен как техника).\n\n```\nfunction sumVertices(root) {\n  if (root == null) return 0;\n\n  let sum = 0;\n  const queue = [root];\n  let head = 0; // чтобы не делать shift() (он дорогой на больших массивах)\n\n  while (head \u003C queue.length) {\n    const node = queue[head++];\n    sum += node.valueNode;\n\n    if (Array.isArray(node.next)) {\n      for (const child of node.next) {\n        queue.push(child);\n      }\n    }\n  }\n\n  return sum;\n}\n```\n\n**Мини-таблица выбора подхода**\n\n| Подход | Плюсы | Минусы | Когда выбирать |\n|---|---|---|---|\n| Рекурсия (DFS) | Самый простой код, естественно отражает “дерево” | Риск переполнения стека на глубоком дереве [web:9] | Дерево неглубокое, важна простота |\n| Итеративный DFS (stack) | Нет риска переполнения стека, быстро и просто | Чуть больше “служебного” кода | Дерево может быть глубоким |\n| Итеративный BFS (queue) | Обходит по уровням, полезно для задач “по слоям” | Нужно аккуратно делать очередь (лучше с индексом) | Нужен уровневый обход |","Дано дерево (вложенный объект), необходимо найти сумму всех вершин ```valueNode```.\n\nПримеры:\n```\nconst tree = {\n  valueNode: 3,\n  next: [\n    {\n      valueNode: 1,\n      next: null,\n    },\n    {\n      valueNode: 3,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: [\n        {\n          valueNode: 1,\n          next: null,\n        },\n        {\n          valueNode: 5,\n          next: null,\n        },\n      ],\n    },\n  ],\n};\n\nsumVertices(tree) // 17\n```\n\n```\nconst tree = {\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 3,\n      next: null\n    },\n    {\n      valueNode: 2,\n      next: null\n    }\n  ]\n} \n\nsumVertices(tree) // 6\n```","livecoding",{"title":94,"description":95,"ogTitle":94,"ogDescription":96,"ogImageUrl":97,"canonical":51,"ogLocale":98,"ogSiteName":99,"ogImageType":100,"ogImageWidth":101,"ogImageHeight":102,"ogType":103,"ogUrl":51},"Дано дерево, надо найти сумму всех вершин","const tree1 = {\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 3,\n      next: null\n    },\n    {\n      valueNode: 2,\n      next: null\n    }\n  ]\n} ","const tree1 = {   valueNode: 1,   next: [     {       valueNode: 3,       next: null     },     {       valueNode: 2,       next: null     }   ] } ","/og-image.png","ru_RU","goodwebjob.ru","image_jpeg","1200","630","website",{"siteName":105,"siteUrl":106},"GOOD WEB JOB!","https://goodwebjob.ru",[108],{"label":109,"slug":110,"to":111},"Подготовка к тех.интервью","technical-interview","/technical-interview/where-to-begin",{"navigationList":113,"navigationSublist":122},[114,118],{"path":111,"isActive":115,"name":116,"icon":117,"isNavbarMobileDisabled":8},false,"С чего начать?","material-symbols:visibility-outline-rounded",{"path":119,"isActive":8,"name":120,"icon":121,"isNavbarMobileDisabled":115},"/technical-interview/tasks","Сборник задач","material-symbols:task-outline",[123,132,159,171,177,318,342,351,357,420,441,447],{"title":124,"list":125,"isOpened":115},"Bash",[126,129],{"name":127,"path":128,"isActive":115},"Дан фрагмент bash-скрипта: cd ~; mkdir foo... Что в нем происходит?","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":130,"path":131,"isActive":115},"Дан фрагмент bash-скрипта: target=$(ps -Af | grep $1 | head -n 1)...","/technical-interview/tasks/here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"title":133,"list":134,"isOpened":115},"CSS",[135,138,141,144,147,150,153,156],{"name":136,"path":137,"isActive":115},"Дан HTML-код. Какой будет цвет у текста «Some dummy text»?","/technical-interview/tasks/the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":139,"path":140,"isActive":115},"Есть шаблон HTML и CSS кода. Какой будет цвет у текста «Таким образом, постоянное»?","/technical-interview/tasks/there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":142,"path":143,"isActive":115},"Есть шаблон вложенного HTML кода. Какой будет цвет у текста «One more dummy text»?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":145,"path":146,"isActive":115},"Есть шаблон вложенного HTML кода. Будет ли display:block у body влиять на span?","/technical-interview/tasks/there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":148,"path":149,"isActive":115},"Есть HTML код. Будет ли font-weight на span влиять?","/technical-interview/tasks/there-is-an-html-code-will-font-weight-affect-span",{"name":151,"path":152,"isActive":115},"Flexbox и Grid, чем отличаются друг от друга?","/technical-interview/tasks/what-are-the-differences-between-flexbox-and-grid",{"name":154,"path":155,"isActive":115},"Заменяют ли Flexbox и Grid друг друга?","/technical-interview/tasks/do-flexbox-and-grid-replace-each-other",{"name":157,"path":158,"isActive":115},"Есть CSS и JS анимация. Какая между ними разница, что быстрее, что более удобно?","/technical-interview/tasks/there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"title":160,"list":161,"isOpened":115},"Git",[162,165,168],{"name":163,"path":164,"isActive":115},"Разрабатывал, взял закоммитил, запушил. Оказалось, что запушил не в ту ветку, точнее, коммит не в ту ветку. Какие действия?","/technical-interview/tasks/developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":166,"path":167,"isActive":115},"В git есть несколько вариантов слияния веток, какие? Чем отличаются?","/technical-interview/tasks/git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":169,"path":170,"isActive":115},"Какие существуют стратегии ветвления для работы команды? Что это такое?","/technical-interview/tasks/what-are-the-branching-strategies-for-the-team-what-is-it",{"title":172,"list":173,"isOpened":115},"HTML",[174],{"name":175,"path":176,"isActive":115},"Что такое HTML?","/technical-interview/tasks/what-is-html",{"title":178,"list":179,"isOpened":115},"JavaScript",[180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,225,228,231,234,237,240,243,246,249,252,255,258,261,264,267,270,273,276,279,282,285,288,291,294,297,300,303,306,309,312,315],{"name":181,"path":182,"isActive":115},"Какие логические значения в console.log будут получены?","/technical-interview/tasks/prototype-what-logical-values-will-be-received-in-console-log",{"name":184,"path":185,"isActive":115},"Почему опасно писать прямо в прототипы базовых типов?","/technical-interview/tasks/why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":187,"path":188,"isActive":115},"Что вернёт следующий код? Object.create(null).hasOwnProperty('toString')","/technical-interview/tasks/what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":190,"path":191,"isActive":115},"Какое значение выведет консоль с object.property?","/technical-interview/tasks/what-value-will-the-console-output-with-object-property",{"name":193,"path":194,"isActive":115},"Что выведется в console.log([arr[0](), arr[0]()])?","/technical-interview/tasks/what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":196,"path":197,"isActive":115},"Что выведет console.log в результате выполнения цикла while?","/technical-interview/tasks/what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":199,"path":200,"isActive":115},"Есть функция и объект. Напишите все известные вам способы, чтобы вывести в консоли значение x из объекта, используя функцию","/technical-interview/tasks/there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":202,"path":203,"isActive":115},"Что вернёт метод book.getUpperName()?","/technical-interview/tasks/what-will-the-book-get-upper-name-method-return",{"name":205,"path":206,"isActive":115},"Переменные объявлены следующим образом: a=3; b=«hello»;. Укажите правильное утверждение","/technical-interview/tasks/variables-are-declared-as-follows-specify-the-correct-statement",{"name":208,"path":209,"isActive":115},"Что выведет консоль в случае присвоения свойства массиву по строковому положительному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":211,"path":212,"isActive":115},"Что выведет консоль в случае присвоения свойства массиву по строковому отрицательному индексу?","/technical-interview/tasks/what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":214,"path":215,"isActive":115},"Что выведет консоль в случае удаления элемента массива с помощью оператора delete?","/technical-interview/tasks/what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":217,"path":218,"isActive":115},"Что вернёт этот код: typeof (function(){})()","/technical-interview/tasks/what-this-code-will-return-typeof-function",{"name":220,"path":221,"isActive":115},"Что получится в результате передачи объекта как аргумента в функцию и выполнения кода?","/technical-interview/tasks/what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":223,"path":224,"isActive":115},"Какие способы объявления функции есть в JavaScript?","/technical-interview/tasks/what-are-the-ways-to-declare-a-function-in-javascript",{"name":226,"path":227,"isActive":115},"Что такое this в JavaScript?","/technical-interview/tasks/what-is-this-in-javascript",{"name":229,"path":230,"isActive":115},"Что такое Event Loop, как работает?","/technical-interview/tasks/what-is-an-event-loop-and-how-does-it-work",{"name":232,"path":233,"isActive":115},"Что будет, если вызвать typeof на необъявленной переменной?","/technical-interview/tasks/what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":235,"path":236,"isActive":115},"Что показывает оператор typeof в JavaScript?","/technical-interview/tasks/what-does-the-typeof-operator-show-in-javascript",{"name":238,"path":239,"isActive":115},"Какие типы данных существует в JavaScript?","/technical-interview/tasks/what-types-of-data-exist-in-javascript",{"name":241,"path":242,"isActive":115},"Какую структуру использовать для хранения упорядоченного списка строк в JavaScript?","/technical-interview/tasks/what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":244,"path":245,"isActive":115},"Что вернет typeof для массива?","/technical-interview/tasks/what-will-typeof-return-for-an-array",{"name":247,"path":248,"isActive":115},"Почему оператор typeof, применённый к массиву, возвращает объект?","/technical-interview/tasks/why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":250,"path":251,"isActive":115},"Если нужно хранить список уникальных строк, какую структуру данных выбрать?","/technical-interview/tasks/if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":253,"path":254,"isActive":115},"Что возвращает typeof для new Set в JavaScript?","/technical-interview/tasks/what-does-typeof-return-for-new-set-in-javascript",{"name":256,"path":257,"isActive":115},"Почему в JavaScript два объекта с одинаковым содержимым при сравнении возвращают false?","/technical-interview/tasks/why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":259,"path":260,"isActive":115},"В чем разница между микро- и макро-тасками в JavaScript?","/technical-interview/tasks/what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":262,"path":263,"isActive":115},"arr.push(0) повлияет на массив так же, как если бы мы выполнили...","/technical-interview/tasks/arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":265,"path":266,"isActive":115},"Вернуть массив от 1 до n, где числа, кратные 3, заменены на 'fizz', кратные 5 - на 'buzz', а кратные и 3, и 5 одновременно - на 'fizzbuzz'","/technical-interview/tasks/returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":268,"path":269,"isActive":115},"Дана строка: 'one.two.three.four.five'. Необходимо из строки сделать вложенный объект","/technical-interview/tasks/the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":271,"path":272,"isActive":115},"Дано дерево (вложенный объект), надо найти сумму всех вершин","/technical-interview/tasks/given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":274,"path":275,"isActive":115},"Для каждого вложенного объекта нужно добавить свойство level, которое равняется числу - номер вложенности","/technical-interview/tasks/for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":277,"path":278,"isActive":115},"Для каждой ветви дерева записать номер вложенности данной ветви","/technical-interview/tasks/for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":280,"path":281,"isActive":115},"Есть массив, в котором лежат объекты с датами, необходимо отсортировать даты по возрастанию","/technical-interview/tasks/there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":283,"path":284,"isActive":115},"Есть слова в массиве, необходимо определить, состоят ли они из одних и тех же букв","/technical-interview/tasks/there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":286,"path":287,"isActive":115},"Есть строка, состоящая из разных скобок, необходимо проверить, закрыты ли все","/technical-interview/tasks/there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":289,"path":290,"isActive":115}," Найти в массиве неповторяющиеся числа","/technical-interview/tasks/find-non-repeating-numbers-in-an-array",{"name":292,"path":293,"isActive":115},"Напишите функцию, который сделает из массива объект","/technical-interview/tasks/write-a-function-that-will-make-an-object-out-of-an-array",{"name":295,"path":296,"isActive":115},"Необходимо проверить, являются ли две строки анаграммами друг друга","/technical-interview/tasks/checks-whether-two-strings-are-anagrams-of-each-other",{"name":298,"path":299,"isActive":115},"Нечётные числа должны отсортироваться по возрастанию, а чётные должны остаться на своих местах","/technical-interview/tasks/odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":301,"path":302,"isActive":115},"Определить, является ли слово палиндромом","/technical-interview/tasks/determines-whether-a-word-is-a-palindrome",{"name":304,"path":305,"isActive":115},"«Расплющивание» массива","/technical-interview/tasks/flattening-the-array",{"name":307,"path":308,"isActive":115},"Реализовать функцию, принимающую аргументы \"*\", \"1\", \"b\", \"1c\" и возвращающую строку \"1*b*1c\"","/technical-interview/tasks/implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":310,"path":311,"isActive":115},"Сжатие строк","/technical-interview/tasks/string-compression",{"name":313,"path":314,"isActive":115},"Уникализация значений в массиве","/technical-interview/tasks/unifying-values-in-an-array",{"name":316,"path":317,"isActive":115},"Числа от 1 до 100 находятся в массиве, они хаотично перемешанные, но в нём не хватает одного числа из этой последовательности. Необходимо найти его","/technical-interview/tasks/the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"title":319,"list":320,"isOpened":115},"React",[321,324,327,330,333,336,339],{"name":322,"path":323,"isActive":115},"Для чего нужен React, какие он решает проблемы?","/technical-interview/tasks/what-is-react-used-for-and-what-problems-does-it-solve",{"name":325,"path":326,"isActive":115},"Какой механизм лежит в основе оптимизации обновлений DOM в React?","/technical-interview/tasks/what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":328,"path":329,"isActive":115},"Если убрать в React VDOM/Fiber, и вручную изменять DOM, разве это не оптимально?","/technical-interview/tasks/if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":331,"path":332,"isActive":115},"Есть блок кода. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":334,"path":335,"isActive":115},"Есть код, в котором список и кнопка. Что в реальном DOM изменится после нажатия на кнопку?","/technical-interview/tasks/there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":337,"path":338,"isActive":115},"Зачем нужен Redux (Mobx/Effector)? Зачем нужен менеджер состояния? Какие проблемы решает?","/technical-interview/tasks/why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":340,"path":341,"isActive":115},"Что мешает организовать централизованное состояние без менеджера состояния? Если организовать состояние механизмами реакта: контекстом, стейтом, в чем проблема? Что менеджеры состояния привносят?","/technical-interview/tasks/what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"title":343,"list":344,"isOpened":115},"Алгоритмы",[345,348],{"name":346,"path":347,"isActive":115},"Что такое алгоритмическая сложность?","/technical-interview/tasks/what-is-algorithmic-complexity",{"name":349,"path":350,"isActive":115},"Какая алгоритмическая сложность у \"быстрой сортировки\"?","/technical-interview/tasks/what-is-the-algorithmic-complexity-of-quick-sort",{"title":352,"list":353,"isOpened":115},"Дебаггинг",[354],{"name":355,"path":356,"isActive":115},"Как диагностировать и исправить нежелательное изменение цвета фона по клику на кнопку, если исходный код сайта запутан и недоступен для прямого чтения?","/technical-interview/tasks/how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"title":358,"list":359,"isOpened":115},"Компьютерные сети",[360,363,366,369,372,375,378,381,384,387,390,393,396,399,402,405,408,411,414,417],{"name":361,"path":362,"isActive":115},"Как браузер после ввода домена понимает, откуда брать сайт?","/technical-interview/tasks/how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":364,"path":365,"isActive":115},"Что такое DNS, как DNS находит нужный IP-адрес?","/technical-interview/tasks/what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":367,"path":368,"isActive":115},"Как домен попадает в DNS в таблицу соответствия: домен – ip","/technical-interview/tasks/how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":370,"path":371,"isActive":115},"Как браузер решает, какое соединение ему открывать, TCP или UDP?","/technical-interview/tasks/how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":373,"path":374,"isActive":115},"Ключевые отличия TCP и UDP","/technical-interview/tasks/key-differences-between-tcp-and-udp",{"name":376,"path":377,"isActive":115},"\"TCP/IP\" - кем является TCP, а кем IP в данном случае?","/technical-interview/tasks/tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":379,"path":380,"isActive":115},"Что такое HTTP и из чего состоит?","/technical-interview/tasks/what-is-http-and-what-does-it-consist-of",{"name":382,"path":383,"isActive":115},"Что такое заголовки в HTTP и зачем они нужны?","/technical-interview/tasks/what-are-http-headers-and-why-do-we-need-them",{"name":385,"path":386,"isActive":115},"Что такое параметры в HTTP?","/technical-interview/tasks/what-are-http-parameters",{"name":388,"path":389,"isActive":115},"Где находится HTML-код в структуре HTTP-ответа?","/technical-interview/tasks/where-is-the-html-code-located-in-the-http-response-structure",{"name":391,"path":392,"isActive":115},"Чем отличаются 1.0, 1.1, 2.0, 3.0 версии HTTP?","/technical-interview/tasks/what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":394,"path":395,"isActive":115},"Пользователь авторизован на сайте. Как сервер узнает об этом с последующими другими заходами, что «я – авторизованный пользователь»?","/technical-interview/tasks/the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":397,"path":398,"isActive":115},"Что такое cookie?","/technical-interview/tasks/what-is-a-cookie",{"name":400,"path":401,"isActive":115},"Кто является инициатором записи cookie в браузере?","/technical-interview/tasks/who-initiates-the-cookie-recording-in-the-browser",{"name":403,"path":404,"isActive":115},"Есть ли возможность с клиента (с браузера) управлять cookie?","/technical-interview/tasks/is-it-possible-to-manage-cookies-from-the-client-browser",{"name":406,"path":407,"isActive":115},"Верно ли утверждение, что злоумышленник, контролирующий роутер и прослушивающий трафик, может получить логины и пароли от сайтов, на которые заходит клиент?","/technical-interview/tasks/is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":409,"path":410,"isActive":115},"Всё, что идет по HTTPS – оно защищено?","/technical-interview/tasks/is-everything-that-goes-through-https-secure",{"name":412,"path":413,"isActive":115},"Все данные зашифрованы, используется https. Хакер взламывает dns и делает подмену одного ip на другой, на фишинговый сайт. В этом случае, злоумышленник может получить данные (логин \\ пароль)?","/technical-interview/tasks/all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":415,"path":416,"isActive":115},"Есть веб-приложение. Помимо HTTP, какие протоколы того же уровня (Application Layer) можно дополнительно использовать в веб-приложении в браузере?","/technical-interview/tasks/there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":418,"path":419,"isActive":115},"Каким способом может выполняться авторизация пользователя на сайте?","/technical-interview/tasks/how-can-a-user-be-authorized-on-a-website",{"title":421,"list":422,"isOpened":115},"Отрисовка в браузере",[423,426,429,432,435,438],{"name":424,"path":425,"isActive":115},"Что происходит, когда HTTP прислал HTML? Что браузер дальше делает c HTML с учетом того, что она валидная?","/technical-interview/tasks/what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":427,"path":428,"isActive":115},"Как браузер парсит JavaScript и изображения при рендеринге?","/technical-interview/tasks/how-the-browser-parses-javascript-and-images-when-rendering",{"name":430,"path":431,"isActive":115},"Что в браузере блокирует рендеринг страницы?","/technical-interview/tasks/what-is-blocking-the-page-rendering-in-the-browser",{"name":433,"path":434,"isActive":115},"Что такое DOM в браузере? Что такое CSSOM?","/technical-interview/tasks/what-is-dom-in-a-browser-what-is-cssom",{"name":436,"path":437,"isActive":115},"Что является узлами в DOM?","/technical-interview/tasks/what-are-nodes-in-the-dom",{"name":439,"path":440,"isActive":115},"Из чего состоит CSSOM?","/technical-interview/tasks/what-does-cssom-consist-of",{"title":442,"list":443,"isOpened":115},"Ревью кода",[444],{"name":445,"path":446,"isActive":115},"По каким характеристикам, ревьюер понимает, что данный код - хороший, а этот код - плохой?","/technical-interview/tasks/how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"title":448,"list":449,"isOpened":115},"Теория вероятности",[450,453,456],{"name":451,"path":452,"isActive":115},"В комнате три человека. Какова вероятность того, что хотя бы двое из них одного пола? То есть два и более.","/technical-interview/tasks/there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":454,"path":455,"isActive":115},"Есть монета. Ее подбрасывают пять раз подряд. Каждый раз записывается, что выпало - орел или решка. Сколько разных последовательностей орлов и решек может при этом получиться?","/technical-interview/tasks/there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":457,"path":458,"isActive":115},"Как гарантированно найти лёгкую фальшивую монету среди 8 за минимальное число взвешиваний на чашечных весах?","/technical-interview/tasks/how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"slugs":460},[461,464,466,468,470,473,476,478,480,482,484,486,489,491,493,495,497,499,501,503,505,507,509,511,513,515,517,519,521,523,525,527,529,531,533,535,537,539,541,543,545,547,549,551,553,555,557,559,561,563,565,567,569,571,573,575,577,579,581,583,585,587,589,591,593,595,597,599,601,603,605,607,609,611,613,615,617,619,621,623,625,627,629,631,633,635,637,639,641,643,645,647,649,651,653,655,657,659,661,663,665,667,669,670,672,674,676,678],{"name":462,"value":463},"Теоретические задания","theoretical-tasks",{"name":217,"value":465},"what-this-code-will-return-typeof-function",{"name":116,"value":467},"where-to-begin",{"name":184,"value":469},"why-is-it-dangerous-to-write-directly-to-the-prototypes-of-basic-types",{"name":471,"value":472},"Backend","backend",{"name":474,"value":475},"Frontend","frontend",{"name":181,"value":477},"prototype-what-logical-values-will-be-received-in-console-log",{"name":298,"value":479},"odd-numbers-should-be-sorted-in-ascending-order-and-even-numbers-should-remain-in-their-original-positions",{"name":289,"value":481},"find-non-repeating-numbers-in-an-array",{"name":262,"value":483},"arr-push-0-will-affect-the-array-in-the-same-way-as-if-we-performed",{"name":268,"value":485},"the-string-one-two-three-four-five-is-given-it-is-necessary-to-make-a-nested-object-out-of-the-string",{"name":487,"value":488},"Реализовать функцию, похоже как в Jquery","implement-a-function-similar-to-jquery",{"name":274,"value":490},"for-each-nested-object-you-need-to-add-the-level-property-which-is-equal-to-a-number-the-nesting-number",{"name":190,"value":492},"what-value-will-the-console-output-with-object-property",{"name":193,"value":494},"what-will-be-displayed-in-console-log-arr-0-arr-0",{"name":265,"value":496},"returns-an-array-from-1-to-n-replacing-numbers-that-are-multiples-of-3-with-fizz-numbers-that-are-multiples-of-5-with-buzz-and-numbers-that-are-multiples-of-both-3-and-5-with-fizzbuzz",{"name":295,"value":498},"checks-whether-two-strings-are-anagrams-of-each-other",{"name":301,"value":500},"determines-whether-a-word-is-a-palindrome",{"name":280,"value":502},"there-is-an-array-containing-objects-with-dates-that-need-to-be-sorted-by-date",{"name":307,"value":504},"implement-a-function-that-accepts-arguments-1-b-1c-and-the-return-string-1-b-1c",{"name":271,"value":506},"given-a-tree-nested-object-it-is-necessary-to-find-the-sum-of-all-vertices",{"name":277,"value":508},"for-each-branch-of-the-tree-write-down-the-nesting-number-of-this-branch",{"name":283,"value":510},"there-are-words-in-the-array-it-is-necessary-to-determine-whether-they-consist-of-the-same-letters",{"name":316,"value":512},"the-numbers-from-1-to-100-are-in-the-array-they-are-randomly-mixed-but-it-lacks-one-number-from-this-sequence-it-is-necessary-to-find-him",{"name":286,"value":514},"there-is-a-string-consisting-of-different-brackets-it-is-necessary-to-check-whether-all-are-closed",{"name":292,"value":516},"write-a-function-that-will-make-an-object-out-of-an-array",{"name":196,"value":518},"what-will-console-log-output-as-a-result-of-executing-the-while-loop",{"name":199,"value":520},"there-is-a-function-and-an-object-write-all-the-ways-you-know-to-output-the-value-of-x-from-an-object-in-the-console-using-the-function",{"name":211,"value":522},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-negative-string-index",{"name":214,"value":524},"what-will-the-console-output-if-an-array-element-is-deleted-using-the-delete-operator",{"name":313,"value":526},"unifying-values-in-an-array",{"name":304,"value":528},"flattening-the-array",{"name":202,"value":530},"what-will-the-book-get-upper-name-method-return",{"name":310,"value":532},"string-compression",{"name":208,"value":534},"what-will-the-console-display-if-a-property-is-assigned-to-an-array-using-a-positive-string-index",{"name":220,"value":536},"what-will-happen-when-an-object-is-passed-as-an-argument-to-a-function-and-the-code-is-executed",{"name":361,"value":538},"how-does-the-browser-know-where-to-get-the-website-after-entering-the-domain",{"name":367,"value":540},"how-does-a-domain-get-into-the-dns-mapping-table-domain-ip",{"name":370,"value":542},"how-does-a-browser-decide-whether-to-open-a-tcp-or-udp-connection",{"name":373,"value":544},"key-differences-between-tcp-and-udp",{"name":376,"value":546},"tcp-ip-who-is-tcp-and-who-is-ip-in-this-case",{"name":379,"value":548},"what-is-http-and-what-does-it-consist-of",{"name":382,"value":550},"what-are-http-headers-and-why-do-we-need-them",{"name":385,"value":552},"what-are-http-parameters",{"name":388,"value":554},"where-is-the-html-code-located-in-the-http-response-structure",{"name":175,"value":556},"what-is-html",{"name":391,"value":558},"what-are-the-differences-between-http-versions-1-0-1-1-2-0-and-3-0",{"name":394,"value":560},"the-user-is-logged-in-on-the-website-how-does-the-server-know-that-i-am-an-authorized-user-when-the-user-logs-in-again",{"name":397,"value":562},"what-is-a-cookie",{"name":400,"value":564},"who-initiates-the-cookie-recording-in-the-browser",{"name":403,"value":566},"is-it-possible-to-manage-cookies-from-the-client-browser",{"name":568,"value":92},"Лайвкодинг",{"name":187,"value":570},"what-will-the-following-code-return-object-create-null-has-own-property-to-string",{"name":409,"value":572},"is-everything-that-goes-through-https-secure",{"name":412,"value":574},"all-data-is-encrypted-https-is-used-let-s-assume-a-hacker-hacks-the-dns-and-makes-a-substitution-of-one-ip-for-another-a-phishing-site",{"name":415,"value":576},"there-is-a-web-application-in-addition-to-http-what-other-protocols-of-the-same-level-application-layer-can-be-used-in-the-web-application-in-browser",{"name":427,"value":578},"how-the-browser-parses-javascript-and-images-when-rendering",{"name":424,"value":580},"what-happens-when-http-sends-html-what-does-the-browser-do-with-this-html-given-that-it-is-valid",{"name":430,"value":582},"what-is-blocking-the-page-rendering-in-the-browser",{"name":433,"value":584},"what-is-dom-in-a-browser-what-is-cssom",{"name":436,"value":586},"what-are-nodes-in-the-dom",{"name":439,"value":588},"what-does-cssom-consist-of",{"name":136,"value":590},"the-html-code-is-given-what-will-be-the-color-of-the-some-dummy-text",{"name":139,"value":592},"there-is-a-template-for-html-and-css-code-what-color-will-the-text-thus-constant-have",{"name":142,"value":594},"there-is-a-template-for-embedded-html-code-what-will-be-the-color-of-the-one-more-dummy-text",{"name":145,"value":596},"there-is-a-template-for-embedded-html-code-will-there-be-a-display-does-bodys-block-affect-span",{"name":148,"value":598},"there-is-an-html-code-will-font-weight-affect-span",{"name":151,"value":600},"what-are-the-differences-between-flexbox-and-grid",{"name":154,"value":602},"do-flexbox-and-grid-replace-each-other",{"name":157,"value":604},"there-are-css-and-js-animations-what-is-the-difference-between-them-and-which-is-faster-and-more-convenient",{"name":120,"value":606},"tasks",{"name":223,"value":608},"what-are-the-ways-to-declare-a-function-in-javascript",{"name":226,"value":610},"what-is-this-in-javascript",{"name":229,"value":612},"what-is-an-event-loop-and-how-does-it-work",{"name":232,"value":614},"what-happens-if-you-call-typeof-on-an-undeclared-variable",{"name":235,"value":616},"what-does-the-typeof-operator-show-in-javascript",{"name":238,"value":618},"what-types-of-data-exist-in-javascript",{"name":241,"value":620},"what-is-the-best-structure-to-use-for-storing-an-ordered-list-of-strings-in-javascript",{"name":244,"value":622},"what-will-typeof-return-for-an-array",{"name":247,"value":624},"why-does-the-typeof-operator-applied-to-an-array-return-an-object",{"name":250,"value":626},"if-you-need-to-store-a-list-of-unique-strings-which-data-structure-should-i-choose",{"name":253,"value":628},"what-does-typeof-return-for-new-set-in-javascript",{"name":322,"value":630},"what-is-react-used-for-and-what-problems-does-it-solve",{"name":328,"value":632},"if-you-remove-the-vdom-fiber-in-react-and-manually-change-the-dom-isn-t-that-optimal",{"name":331,"value":634},"there-is-a-block-of-code-what-changes-in-the-real-dom-after-clicking-the-button",{"name":334,"value":636},"there-is-a-code-in-which-there-is-a-list-and-a-button-what-will-change-in-the-real-dom-after-clicking-on-the-button",{"name":337,"value":638},"why-do-we-need-redux-mobx-effector-why-do-we-need-a-state-manager-what-problems-does-it-solve",{"name":355,"value":640},"how-can-diagnose-and-fix-unwanted-background-color-changes-when-clicking-on-a-button-if-the-source-code-of-the-site-is-confusing-and-inaccessible-to-direct-reading",{"name":163,"value":642},"developed-it-committed-it-and-launched-it-it-turned-out-that-i-had-pushed-it-to-the-wrong-branch-or-rather-the-commit-was-in-the-wrong-branch-what-actions",{"name":166,"value":644},"git-has-several-options-for-merging-branches-which-ones-how-are-they-different",{"name":169,"value":646},"what-are-the-branching-strategies-for-the-team-what-is-it",{"name":445,"value":648},"how-does-a-reviewer-know-which-code-is-good-and-which-code-is-bad",{"name":127,"value":650},"here-is-a-fragment-of-a-bash-script-cd-mkdir-foo-what-is-happening-in-this-script",{"name":130,"value":652},"here-is-a-fragment-of-a-bash-script-target-ps-af-grep-1-head-n-1",{"name":346,"value":654},"what-is-algorithmic-complexity",{"name":349,"value":656},"what-is-the-algorithmic-complexity-of-quick-sort",{"name":256,"value":658},"why-do-two-objects-with-the-same-content-return-false-when-compared-in-javascript",{"name":418,"value":660},"how-can-a-user-be-authorized-on-a-website",{"name":259,"value":662},"what-is-the-difference-between-micro-and-macro-tasks-in-javascript",{"name":451,"value":664},"there-are-three-people-in-the-room-what-is-the-probability-that-at-least-two-of-them-are-of-the-same-sex-that-is-two-or-more",{"name":454,"value":666},"there-is-a-coin-it-is-tossed-five-times-in-a-row-each-time-it-is-recorded-whether-it-lands-on-heads-or-tails-how-many-different-sequences-of-heads-and-tails-can-be-obtained",{"name":457,"value":668},"how-can-you-guarantee-to-find-an-easy-fake-coin-among-8-in-the-minimum-number-of-weighings-on-a-balance-scale",{"name":109,"value":110},{"name":406,"value":671},"is-it-true-that-an-attacker-who-controls-a-router-and-listens-to-traffic-can-obtain-logins-and-passwords-from-websites-that-a-client-visits",{"name":364,"value":673},"what-is-dns-and-how-does-dns-find-the-correct-ip-address",{"name":205,"value":675},"variables-are-declared-as-follows-specify-the-correct-statement",{"name":325,"value":677},"what-is-the-underlying-mechanism-for-optimizing-dom-updates-in-react",{"name":340,"value":679},"what-prevents-you-from-organizing-a-centralized-state-without-a-state-manager-if-you-organize-the-state-using-react-context-and-state-mechanisms-what-is-the-problem-what-do-state-managers-add",{"cooperation":681,"copyright":684,"reportError":685,"socialNetwork":687},{"link":682,"title":683},"https://t.me/baurinanton","Сотрудничество","© “GOOD WEB JOB!”",{"label":686,"link":682},"Сообщить об ошибке",{"label":688,"socialNetworkList":689},"Мы в соцсетях:",[690,693,696],{"icon":51,"link":691,"title":692},"https://max.ru/u/f9LHodD0cOKMaukdnnahTeL5pwvjrPfUaZ4S8_1rsNy9I9qsmc9Ar3kP_y8","Max",{"icon":694,"link":682,"title":695},"ic:baseline-telegram","Telegram",{"icon":697,"link":698,"title":699},"ri:vk-fill","https://vk.com/baurinanton","VK",{"data":701,"body":702},{},{"type":703,"children":704},"root",[705,722,727,739],{"type":706,"tag":707,"props":708,"children":709},"element","p",{},[710,713,720],{"type":711,"value":712},"text","Дано дерево (вложенный объект), необходимо найти сумму всех вершин ",{"type":706,"tag":714,"props":715,"children":717},"code",{"className":716},[],[718],{"type":711,"value":719},"valueNode",{"type":711,"value":721},".",{"type":706,"tag":707,"props":723,"children":724},{},[725],{"type":711,"value":726},"Примеры:",{"type":706,"tag":728,"props":729,"children":733},"pre",{"className":730,"code":732,"language":711},[731],"language-text","const tree = {\n  valueNode: 3,\n  next: [\n    {\n      valueNode: 1,\n      next: null,\n    },\n    {\n      valueNode: 3,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: null,\n    },\n    {\n      valueNode: 2,\n      next: [\n        {\n          valueNode: 1,\n          next: null,\n        },\n        {\n          valueNode: 5,\n          next: null,\n        },\n      ],\n    },\n  ],\n};\n\nsumVertices(tree) // 17\n",[734],{"type":706,"tag":714,"props":735,"children":737},{"__ignoreMap":736},"",[738],{"type":711,"value":732},{"type":706,"tag":728,"props":740,"children":743},{"className":741,"code":742,"language":711},[731],"const tree = {\n  valueNode: 1,\n  next: [\n    {\n      valueNode: 3,\n      next: null\n    },\n    {\n      valueNode: 2,\n      next: null\n    }\n  ]\n} \n\nsumVertices(tree) // 6\n",[744],{"type":706,"tag":714,"props":745,"children":746},{"__ignoreMap":736},[747],{"type":711,"value":742},{"data":749,"body":750},{},{"type":703,"children":751},[752,786,791,800],{"type":706,"tag":707,"props":753,"children":754},{},[755,757,762,764,770,772,778,780,784],{"type":711,"value":756},"Каждый узел — это объект с числом ",{"type":706,"tag":714,"props":758,"children":760},{"className":759},[],[761],{"type":711,"value":719},{"type":711,"value":763}," и полем ",{"type":706,"tag":714,"props":765,"children":767},{"className":766},[],[768],{"type":711,"value":769},"next",{"type":711,"value":771},", которое либо ",{"type":706,"tag":714,"props":773,"children":775},{"className":774},[],[776],{"type":711,"value":777},"null",{"type":711,"value":779},", либо массив дочерних узлов.",{"type":706,"tag":781,"props":782,"children":783},"br",{},[],{"type":711,"value":785},"\nСумма по дереву — это сумма значения текущего узла плюс суммы всех его потомков.",{"type":706,"tag":707,"props":787,"children":788},{},[789],{"type":711,"value":790},"Упрощённая схема (для первого примера):",{"type":706,"tag":728,"props":792,"children":795},{"className":793,"code":794,"language":711},[731],"(3)\n   /    /     \\      \\\n (1)  (3)     (2)     (2)\n                    /    \\\n                  (1)    (5)\n",[796],{"type":706,"tag":714,"props":797,"children":798},{"__ignoreMap":736},[799],{"type":711,"value":794},{"type":706,"tag":707,"props":801,"children":802},{},[803],{"type":711,"value":804},"Сумма должна учитывать все числа в кружках.",{"data":806,"body":807},{},{"type":703,"children":808},[809,819,856,861],{"type":706,"tag":707,"props":810,"children":811},{},[812,814,817],{"type":711,"value":813},"Рекурсивная идея строится на том, что “часть дерева” (поддерево) имеет тот же формат, что и всё дерево.",{"type":706,"tag":781,"props":815,"children":816},{},[],{"type":711,"value":818},"\nОпределяется правило:",{"type":706,"tag":820,"props":821,"children":822},"ul",{},[823,844],{"type":706,"tag":824,"props":825,"children":826},"li",{},[827,829,834,836,842],{"type":711,"value":828},"Если узла нет (",{"type":706,"tag":714,"props":830,"children":832},{"className":831},[],[833],{"type":711,"value":777},{"type":711,"value":835}," или ",{"type":706,"tag":714,"props":837,"children":839},{"className":838},[],[840],{"type":711,"value":841},"undefined",{"type":711,"value":843},"), сумма равна 0.",{"type":706,"tag":824,"props":845,"children":846},{},[847,849,855],{"type":711,"value":848},"Если узел есть, сумма равна ",{"type":706,"tag":714,"props":850,"children":852},{"className":851},[],[853],{"type":711,"value":854},"node.valueNode + сумма всех детей",{"type":711,"value":721},{"type":706,"tag":707,"props":857,"children":858},{},[859],{"type":711,"value":860},"В коде часто выглядит так:",{"type":706,"tag":820,"props":862,"children":863},{},[864,875],{"type":706,"tag":824,"props":865,"children":866},{},[867,869],{"type":711,"value":868},"базовый случай: ",{"type":706,"tag":714,"props":870,"children":872},{"className":871},[],[873],{"type":711,"value":874},"if (root == null) return 0;",{"type":706,"tag":824,"props":876,"children":877},{},[878,880,886],{"type":711,"value":879},"рекурсивный шаг: суммирование детей через цикл или ",{"type":706,"tag":714,"props":881,"children":883},{"className":882},[],[884],{"type":711,"value":885},"reduce()",{"type":711,"value":721},{"data":888,"body":889},{},{"type":703,"children":890},[891,906],{"type":706,"tag":707,"props":892,"children":893},{},[894,899,901,904],{"type":706,"tag":714,"props":895,"children":897},{"className":896},[],[898],{"type":711,"value":885},{"type":711,"value":900}," превращает массив в одно значение, “накапливая” результат в аккумуляторе.",{"type":706,"tag":781,"props":902,"children":903},{},[],{"type":711,"value":905},"\nВ задаче аккумулятором является сумма, которая увеличивается для каждого ребёнка.",{"type":706,"tag":707,"props":907,"children":908},{},[909,911,916,918,924],{"type":711,"value":910},"Важный момент для начинающих: если массив детей пустой, ",{"type":706,"tag":714,"props":912,"children":914},{"className":913},[],[915],{"type":711,"value":885},{"type":711,"value":917}," должен иметь корректное начальное значение аккумулятора. В рекурсивном решении начальное значение задано как ",{"type":706,"tag":714,"props":919,"children":921},{"className":920},[],[922],{"type":711,"value":923},"root.valueNode",{"type":711,"value":925},", поэтому даже при пустом списке детей возвращается значение текущего узла.",{"data":927,"body":928},{},{"type":703,"children":929},[930],{"type":706,"tag":707,"props":931,"children":932},{},[933,935,938],{"type":711,"value":934},"Рекурсивный вызов функции создаёт новый кадр в стеке вызовов. Если глубина дерева слишком велика, стек заканчивается.",{"type":706,"tag":781,"props":936,"children":937},{},[],{"type":711,"value":939},"\nИтеративный обход хранит “что обработать дальше” в обычном массиве (стек/очередь), поэтому ограничение по глубине становится значительно мягче.",{"data":941,"body":942},{},{"type":703,"children":943},[944,963],{"type":706,"tag":707,"props":945,"children":946},{},[947,949,954,956,961],{"type":711,"value":948},"Так как по условию ",{"type":706,"tag":714,"props":950,"children":952},{"className":951},[],[953],{"type":711,"value":769},{"type":711,"value":955}," бывает ",{"type":706,"tag":714,"props":957,"children":959},{"className":958},[],[960],{"type":711,"value":777},{"type":711,"value":962},", требуется проверка перед обходом детей:",{"type":706,"tag":820,"props":964,"children":965},{},[966,977],{"type":706,"tag":824,"props":967,"children":968},{},[969,971],{"type":711,"value":970},"надёжно: ",{"type":706,"tag":714,"props":972,"children":974},{"className":973},[],[975],{"type":711,"value":976},"Array.isArray(node.next)",{"type":706,"tag":824,"props":978,"children":979},{},[980,982],{"type":711,"value":981},"допустимо и кратко: ",{"type":706,"tag":714,"props":983,"children":985},{"className":984},[],[986],{"type":711,"value":987},"const children = node.next ?? []",{"data":989,"body":990},{},{"type":703,"children":991},[992],{"type":706,"tag":707,"props":993,"children":994},{},[995,997,1003,1005,1011,1013,1018,1020,1025,1027,1033],{"type":711,"value":996},"Optional chaining ",{"type":706,"tag":714,"props":998,"children":1000},{"className":999},[],[1001],{"type":711,"value":1002},"?.",{"type":711,"value":1004}," (например, ",{"type":706,"tag":714,"props":1006,"children":1008},{"className":1007},[],[1009],{"type":711,"value":1010},"node.next?.length",{"type":711,"value":1012},") полезен, когда часть цепочки может быть ",{"type":706,"tag":714,"props":1014,"children":1016},{"className":1015},[],[1017],{"type":711,"value":777},{"type":711,"value":1019},"/",{"type":706,"tag":714,"props":1021,"children":1023},{"className":1022},[],[1024],{"type":711,"value":841},{"type":711,"value":1026},". Однако в данной задаче ",{"type":706,"tag":714,"props":1028,"children":1030},{"className":1029},[],[1031],{"type":711,"value":1032},"Array.isArray(...)",{"type":711,"value":1034}," даёт более строгую гарантию “это массив”, а не просто “что-то существует”.",{"data":1036,"body":1037},{},{"type":703,"children":1038},[1039,1052],{"type":706,"tag":707,"props":1040,"children":1041},{},[1042,1044,1050],{"type":711,"value":1043},"Пусть ",{"type":706,"tag":714,"props":1045,"children":1047},{"className":1046},[],[1048],{"type":711,"value":1049},"n",{"type":711,"value":1051}," — количество узлов в дереве.",{"type":706,"tag":820,"props":1053,"children":1054},{},[1055,1060],{"type":706,"tag":824,"props":1056,"children":1057},{},[1058],{"type":711,"value":1059},"Время у всех решений: O(n), так как каждый узел посещается один раз.",{"type":706,"tag":824,"props":1061,"children":1062},{},[1063,1065],{"type":711,"value":1064},"Память:\n",{"type":706,"tag":820,"props":1066,"children":1067},{},[1068,1081,1086],{"type":706,"tag":824,"props":1069,"children":1070},{},[1071,1073,1079],{"type":711,"value":1072},"Рекурсивный DFS: O(h), где ",{"type":706,"tag":714,"props":1074,"children":1076},{"className":1075},[],[1077],{"type":711,"value":1078},"h",{"type":711,"value":1080}," — высота дерева (глубина), кадры лежат в стеке вызовов.",{"type":706,"tag":824,"props":1082,"children":1083},{},[1084],{"type":711,"value":1085},"Итеративный DFS: O(h) в худшем случае, элементы лежат в собственном стеке.",{"type":706,"tag":824,"props":1087,"children":1088},{},[1089,1091,1097],{"type":711,"value":1090},"BFS: O(w), где ",{"type":706,"tag":714,"props":1092,"children":1094},{"className":1093},[],[1095],{"type":711,"value":1096},"w",{"type":711,"value":1098}," — максимальная ширина уровня, элементы лежат в очереди.",{"data":1100,"body":1101},{},{"type":703,"children":1102},[1103],{"type":706,"tag":707,"props":1104,"children":1105},{},[1106,1108,1113],{"type":711,"value":1107},"Кратко: сумма ",{"type":706,"tag":714,"props":1109,"children":1111},{"className":1110},[],[1112],{"type":711,"value":719},{"type":711,"value":1114}," находится простым обходом всех узлов (O(n)): рекурсивный DFS — самый наглядный, но на глубоком дереве может упасть из-за стека; итеративный DFS/BFS решает ту же задачу без рекурсии и обычно надёжнее для больших глубин.",1775575822652]