Перейти к содержимому

Как инвертировать бинарное дерево

  • автор:

Если программирование изучать с нуля — то какую область?

Дано — человек возрастом за 30, про программирование в частности и компьютеры вообще не знает почти ничего. Но хочет узнать. С прицелом на зарабатывание потом денег. Да, образование — гуманитарное, гуманитарнее не бывает.
Отметая с негодованием ответ «не взлетит», как неорганизованный, хочу посоветоваться с сообществом — какую область лучше изучать, если всё равно какую? И с чего начинать?

Xellos ★★★★★
13.08.15 11:10:10 MSK
← 1 2

Пусть откроет браузер, в нем откроет «инструменты разработчика», там найдет консоль для Javascript — пусть пишет первые программы прямо там, без текстовых редакторов, IDE и прочей фигни.

outtaspace ★★★
( 13.08.15 13:13:23 MSK )

Еще один вариант: пусть научится инвертировать бинарное дерево на маркерной доске.

outtaspace ★★★
( 13.08.15 13:15:49 MSK )
Ответ на: комментарий от outtaspace 13.08.15 13:15:49 MSK

А как это, инвертировать бинарное дерево?

vertexua ★★★★★
( 13.08.15 13:17:38 MSK )
Ответ на: комментарий от vertexua 13.08.15 13:17:38 MSK

outtaspace ★★★
( 13.08.15 13:22:56 MSK )
Ответ на: комментарий от outtaspace 13.08.15 13:22:56 MSK

Если это означает развернуть дерево другой стороной, то почти любой инженер скажет что можно просто написать проскирующий интерфейс делающий вид что дерево уже развернуто. Или как фичу самого дерева

vertexua ★★★★★
( 13.08.15 13:27:21 MSK )
Ответ на: комментарий от vertexua 13.08.15 13:27:21 MSK

Зеркальное отражение же. По убыванию -> По возрастанию. Развивает память, когда переписываешь циферки из кружочка в кружочек.

pacify ★★★★★
( 13.08.15 13:38:01 MSK )

какую область лучше изучать, если всё равно какую?

никакую. пусть изучает то, что не все равно.

waker ★★★★★
( 13.08.15 13:39:53 MSK )
Ответ на: комментарий от GblGbl 13.08.15 12:22:15 MSK

А что у нас сейчас есть по «азам компьютерной грамотности»? Когда-то давно, двадцать лет назад, ответ был «Фигурнов». А сейчас?

Xellos ★★★★★
( 13.08.15 13:53:31 MSK ) автор топика
Ответ на: комментарий от Akamanah 13.08.15 11:14:44 MSK

Oracle Database программист еще есть. Чуть ли не самая высокооплачиваемая задача 🙂 Т.е. именно программист, а не дба. Нужно как бох шарить в sql, стандартных аналитических функциях (их чертова уйма), писать stored procedures на oracle plsql

а программирования как раз не особо надо

но непонятно, как чувак с нуля может в такое войти, да. Его ж на собеседовании попросят сразу базовое знание джавы, алгоритмов, еще чего-то

лучше идти писать гуи для андроида, там авось проканает не сдавать этот экзамен на CS

stevejobs ★★★★☆
( 13.08.15 13:55:40 MSK )
Ответ на: комментарий от waker 13.08.15 13:39:53 MSK

мне не всё равно поспать и поесть. И еще путешествовать, может быть. Денег за это не платят, к сожалению.

stevejobs ★★★★☆
( 13.08.15 13:56:09 MSK )
Последнее исправление: stevejobs 13.08.15 13:56:26 MSK (всего исправлений: 1)

Ответ на: комментарий от Xellos 13.08.15 11:21:56 MSK

А зачем человеку советовать то, что сам умеешь? Чтобы он потом отбирал твой хлеб?

А программирование ему необходимо для зарабатывания денег? Тогда пусть попробует изучать вот это — http://xamarin.com/visual-studio

alman ★★★
( 13.08.15 14:00:18 MSK )

Можно изучать postgres.

А вообще, с своё время, один преподаватель программирования говорил, что хорошо бы иметь свою научную область (будь то физика, или там биофизика, или финансы и т.д.). И у вот у некоторых такая область была, а у некоторых её не было. Что интересно, говорилось это людям, профессионально изучающим CS, а именно ПО. Делайте выводы.

Deleted
( 13.08.15 14:13:45 MSK )
Последнее исправление: Deleted 13.08.15 14:18:18 MSK (всего исправлений: 1)

Пусть берёт Python и понеслась. Там уже потом сам область выберет, Python практически везде можно юзать.

th3m3 ★★★★★
( 13.08.15 14:14:16 MSK )
Ответ на: комментарий от stevejobs 13.08.15 13:56:09 MSK

мне не всё равно поспать и поесть. И еще путешествовать, может быть. Денег за это не платят, к сожалению.

если уметь хорошо спать, есть и путешествовать — то платят.

waker ★★★★★
( 13.08.15 14:15:48 MSK )
Ответ на: комментарий от alman 13.08.15 14:00:18 MSK

А зачем человеку советовать то, что сам умеешь?

Затем, что смогу помочь, подсказать. Мой хлеб отобрать сложно.

Xellos ★★★★★
( 13.08.15 14:17:33 MSK ) автор топика
Ответ на: комментарий от alman 13.08.15 14:00:18 MSK

А зачем человеку советовать то, что сам умеешь?

С тебя же не убудет )

Deleted
( 13.08.15 14:22:32 MSK )

А потом удивляемся, откуда в фрилансе столько предложений по 10 копеек. Вы бы ещё дворников научили кодить.

Sadler ★★★
( 13.08.15 14:30:42 MSK )

Начать с HTML + CSS. Рекомендую htmlacademy, шикарный ресурс. В общем-то деньги можно начать зарабатывать практически сразу. Продолжить JavaScript, PHP, изучение популярных CMS движков вроде WordPress.

Legioner ★★★★★
( 13.08.15 14:30:52 MSK )

Если программирование изучать с нуля — то какую область?

Насчёт нуля не знаю, но если сильно ниже — бери Якутию

frame ★★★
( 13.08.15 14:35:56 MSK )

Oracle для девочек

stevejobs ★★★★☆
( 13.08.15 14:38:44 MSK )

1С. Я серьезно. Если нет отвращения, а у гуманитария его быть не должно, то отличный вариант. Бабла в этой области очень много, и почти всегда есть куда развиваться. А потом можно и свой бизнес интеграторский замутить.

Loki13 ★★★★★
( 13.08.15 14:40:10 MSK )
Ответ на: комментарий от Sadler 13.08.15 14:30:42 MSK

А потом удивляемся, откуда в фрилансе столько предложений по 10 копеек. Вы бы ещё дворников научили кодить.

Бомжа же научили уже на яваскрите писать.

Kaschenko
( 13.08.15 14:42:35 MSK )
Последнее исправление: Kaschenko 13.08.15 14:42:51 MSK (всего исправлений: 1)

Ответ на: комментарий от Xellos 13.08.15 11:41:02 MSK

Не обязательно. В одноце еще куча направлений, всякие УТ,УПП и так далее. Да и стажером на первое время тысяч за 20-25 найти работу не сложно. Питонистом каким думаю намного сложнее без знаний устроится.

Loki13 ★★★★★
( 13.08.15 14:43:09 MSK )

образование — гуманитарное, гуманитарнее не бывает. И с чего начинать?

quickquest ★★★★★
( 13.08.15 15:27:34 MSK )
Ответ на: комментарий от Kaschenko 13.08.15 14:42:35 MSK

Он потом сорвался же.

Bfgeshka ★★★★★
( 13.08.15 16:18:30 MSK )

Для начала, как гуманитарий задумайся:«На фуа гра ты пытаешься изменить таким образом мир?». Просто «зарабатывать денег» может не прокатить. От постоянных попыток взбодрить разум на постижение всякого разного может наступить ступор из-за того, что в конце концов ты будешь тупо сидеть пере монитором и как свидетель иеговы твердить мантру «надо учить (далее вставить по смыслу)», но внимание будет предательски отлынивать и выгорать. Т.е. будет стресс на ровном месте. А если ещё жизненные проблемы навалятся? Но, для начала, Android (и/или) iOS вполне как вариант. Пока будешь осваивать настройку, установку и т.д. освоишь компьютер. Если дойдешь до «Hello world!», начнешь осознавать, чем это тебе грозит и ужас бездны нужных познаний, который предстоит преодолеть, прежде чем ты будешь интересен как специалист. Про железячников — тухлое дело. Увы. У людей с профильным образованием и богатым опытом в России перспективы так себе. Пока это факт, который ещё не опровергнул.

Анализ алгоритма

Если root = NULL, то инвертированным для пустого дерева будет пустое.

Далее для каждой вершины следует переставить местами левого и правого сына. То есть root -> left присвоить инвертированное правое поддерево, а root -> right присвоить инвертированное левое поддерево .

TreeNode* invertTree(TreeNode* root)

if (root == NULL) return root;

TreeNode* temp = root->left;

Java реализация

public class Solution

public TreeNode invertTree(TreeNode root)

if (root == null) return root;

TreeNode temp = root.left;

Задача: инвертируем бинарное дерево

Решаем задачи, которые дают программистам на собеседованиях в IT-компаниях. Сегодня инвертируем бинарное дерево.

Иллюстрация: Polina Vari для Skillbox Media

Дмитрий Зверев

Дмитрий Зверев

Любитель научной фантастики и технологического прогресса. Хорошо сочетает в себе заумного технаря и утончённого гуманитария. Пишет про IT и радуется этому.

Сергей Голицын

Senior Java Developer в Covalent Inc. и преподаватель. Больше семи лет в Java-разработке. В свободное время судит хакатоны и делится опытом с начинающими программистами. Пишет статьи для «Хабра» и Medium. Ведёт телеграм-каналы «Полезные ссылки около Java» и Cracking code interview.

Условие. Дан массив узлов бинарного дерева — root. Нужно инвертировать дерево и вернуть полученный массив. Инвертировать бинарное дерево — значит сделать так, чтобы слева от главного узла были значения больше него, а справа — меньше. Когда значения равны, их можно помещать с любой стороны.

Ввод и вывод. Пример 1

Ввод: root = [2,1,3] Вывод: [2,3,1]
Ввод и вывод. Пример 3
Ввод: root = [] Вывод: []

Решить эту задачу самостоятельно и на разных языках программирования можно на LeetCode. Наше решение взято из Telegram-канала Сергея Cracking code interview.

Решение

Чтобы решить эту задачу, мы должны поменять все левые и правые элементы местами и сделать это в обратном порядке — с помощью рекурсии.

Начнём с самого верхнего узла и будем двигаться вниз — до самого нижнего. Каждый раз, когда мы заходим на очередной узел, меняем левый и правый элементы местами. А когда узлы закончатся, возвращаем полученный массив.

Полный алгоритм такой:

  • На входе мы получаем узел бинарного дерева — root.
  • Проверяем: если root — это пустой массив или null, то возвращаем null.
  • Если нет: вызываем рекурсию на левый узел, а затем на правый.
  • После того как обе рекурсии вернули результаты, меняем левый и правый узлы местами.
  • Возвращаем корень дерева.

Вот как этот алгоритм будет реализован на Java:

public TreeNode invertTree(TreeNode root) < if(root == null)< return null; > TreeNode left = invertTree(root.left); TreeNode right = invertTree(root.right); root.left = right; root.right = left; return root; > >

Временная сложность: O(n) — так как мы перебирали все элементы массива.

Ёмкостная сложность: O(1) — нам нужно заранее определённое количество места в памяти (максимальный размер памяти — размер массива бинарного дерева).

Читайте также:

  • Задача: проверить строки на изоморфность
  • Тест. Какой язык создадите вы — Java или Python?
  • Рекурсия вокруг нас: люди, соборы и капуста романеско

Фронтендер пытается инвертировать бинарное дерево: ⁠ ⁠

Фронтендер пытается инвертировать бинарное дерево:

А что за операция такая инвертирование деревьев? Заменить направления дуг графа?

раскрыть ветку
3 месяца назад

А эти деревья вообще в энтерпрайзе используются? А то мне нигде, кроме тестов и собесов (и то на джуна) такое не встречалось.

раскрыть ветку
3 месяца назад

тем временем бекендер

Иллюстрация к комментарию

3 месяца назад

Без приколов один из моих студентов мне ответил так на экзамене. А на вопрос «сколько рёбер в бинарном дереве если количество листьев n» ответил что два — правое и левое.

3 месяца назад

-webkit-transform: scaleX(-1);
transform: scaleX(-1);

Похожие посты
9 часов назад
Подписаться

Невероятно, может архивы неполные⁠ ⁠

Невероятно, может архивы неполные

11 часов назад
Подписаться

«Ты должен был возглавить проект, а не покинуть его!»⁠ ⁠

"Ты должен был возглавить проект, а не покинуть его!"

Поддержать
1 день назад
Подписаться

Пацан к успеху шёл, не получилось, не фартануло⁠ ⁠

Пацан к успеху шёл, не получилось, не фартануло IT юмор, Программист, Программирование, Python, Картинка с текстом, IT, ВКонтакте (ссылка)

2 дня назад
Подписаться

Чат GPT становится все больше похожим на программистов. ⁠ ⁠

Чат GPT становится все больше похожим на программистов. IT юмор, IT, Программирование, Искусственный интеллект, Повтор

* Код, который ты мне дал, не работает. Можешь исправить?

* У меня всё работает.

2 дня назад
Подписаться

SQL задача про IN и NOT IN с объяснением⁠ ⁠

SQL задача про IN и NOT IN с объяснением Программирование, IT, Собеседование, SQL, Ms SQL, Oracle, Субд, База данных, Telegram (ссылка)

Всем отличного начала нового года! Вчера утром в своём Телеграм-канале опубликовал интересную задачу по SQL с собеседования про IN и NOT IN.

С первого взгляда кажущееся правильным решение на самом деле ложно. Чтобы верно ответить в задаче, нужно знать как СУБД обрабатывает элементы множества, указанные для оператора IN / NOT IN в запросе.

Вначале вот текст самой задачи. Ниже я поясню правильное решение:

В таблице CLIENTS пять строк. В первых двух строках в поле CLIENT_TYPE значение 1, ещё в двух строках в CLIENT_TYPE значение 2 и в последней строке поле CLIENT_TYPE не заполнено, то есть в последней строке в поле CLIENT_TYPE значение NULL.

Есть два запроса:
1)
SELECT * FROM CLIENTS WHERE CLIENT_TYPE IN (1)
2)
SELECT * FROM CLIENTS WHERE CLIENT_TYPE NOT IN (2, NULL)
Результирующие наборы данных, полученные в результате выполнения этих запросов, будут одинаковыми или разными?

Здесь поставь чтение на паузу и ответь на вопрос самостоятельно.

На сегодня на канале следующий разброс ответов:

SQL задача про IN и NOT IN с объяснением Программирование, IT, Собеседование, SQL, Ms SQL, Oracle, Субд, База данных, Telegram (ссылка)

Первый запрос отбирает клиентов, у которых в столбце тип указано значение 1. В результате будут отобраны две строки. Здесь все понятно. Так как в таблице клиентов ещё остаются строки, не попавшие в выбор первого запроса, со значениями в столбце тип 2 и NULL, то видится, что второй запрос должен как раз вернуть такой же результирующий набор данных. Однако, тут дело в коварном NULL в значениях для оператора NOT IN. СУБД представляет оператор NOT IN:

SELECT * FROM CLIENTS WHERE CLIENT_TYPE NOT IN (2, NULL)

в результате должны быть отобраны клиенты, у которых значение в столбце тип не равно каждому из перечисленных во множестве значений:

SELECT * FROM CLIENTS WHERE ( (CLIENT_TYPE <> 2) AND (CLIENT_TYPE <> NULL) )

С NULL не допустимо использовать операторы сравнения. При сравнении с NULL (= NULL, <> NULL) результат будет всегда отрицательным.

Второй запрос не вернёт ни одной строки данных.

Ещё больше полезного и интересного в моём Телеграмм-Канале.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *