Skip to content

110. Balanced Binary Tree#31

Open
GrishinAnton wants to merge 3 commits into
masterfrom
110.balanced-binary-tree
Open

110. Balanced Binary Tree#31
GrishinAnton wants to merge 3 commits into
masterfrom
110.balanced-binary-tree

Conversation

@GrishinAnton
Copy link
Copy Markdown
Owner

Сделал сравнение для каждого дерева по отдельности.
Левую часть и правую часть - прокидываю переменные.
Потом обнуляю и так же для правой части.

ЧТо-то очень грамозко выходит...И задумался как теперь два дерева проверять..заводить 4 переменных?

@GrishinAnton GrishinAnton requested a review from vitkarpov May 5, 2020 16:28
@vitkarpov
Copy link
Copy Markdown
Collaborator

Ох, что-то я не пойму здесь идею. Можешь, плз, подробнее рассказать как именно ты хочешь делать?

@GrishinAnton
Copy link
Copy Markdown
Owner Author

Ох, что-то я не пойму здесь идею. Можешь, плз, подробнее рассказать как именно ты хочешь делать?

Есть подозрение что через стек эту задачу решать плохая идея.

Если идти в шиирну, то эта задача легко решается....

@vitkarpov
Copy link
Copy Markdown
Collaborator

vitkarpov commented May 5, 2020 via email

@GrishinAnton
Copy link
Copy Markdown
Owner Author

GrishinAnton commented May 5, 2020

@vitkarpov
Написал решение через обход в ширину, считая уровни начиная с того, где нет одного из детей.
Все было хорошо, пока не попал на такой граф [1,2,2,3,3,3,3,4,4,4,4,4,4,null,null,5,5]
Тут получается https://prnt.sc/sbiesz я на крайней тройке начинаю считать и на 5 слева у меня уже "небаланс" так как + 2 уровня.
Но по графу это баланс и значит счиать уровни, было не той идеей которая решает задачу:)

@vitkarpov
Copy link
Copy Markdown
Collaborator

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

@GrishinAnton
Copy link
Copy Markdown
Owner Author

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

Что-то я запутался.
Тогда как тут быть https://prnt.sc/sbnhba тут лева все сбалансировано, а по сути повторяет тот график что выше, но пишет что этот не сбалансирован...

@vitkarpov
Copy link
Copy Markdown
Collaborator

vitkarpov commented May 6, 2020

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

Что-то я запутался.
Тогда как тут быть https://prnt.sc/sbnhba тут лева все сбалансировано, а по сути повторяет тот график что выше, но пишет что этот не сбалансирован...

Не, здесь у корня (1) высота левой ветки 3, а высота правой ветки 1. Поэтому баланса нет.
В этом же примере высота левой и правой для каждого узла отличается не более чем на 1, в частности, для корня — высота левого 4, а правого 3.

@GrishinAnton
Copy link
Copy Markdown
Owner Author

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

Пока нет идей как это сделать, думаю...:)

@vitkarpov
Copy link
Copy Markdown
Collaborator

vitkarpov commented May 7, 2020

Давай опять же рекурсию прорабатывать:

  • базовый случай: если узел является листом — высота равна 0
  • рекурсивное соотношение: если узел не является листом — высота равна 1 + max(высота левого ребёнка, высота правого ребёнка)

Нужно написать функцию getHeight, которая рекурсивно в глубину будет обходить дерево и считать для каждого узла высоту соответственно, ну и там же можно, получая высоту для левого и правого ребёнка, сравнивать их и если разницы больше 1, ставить где-нибудь глобальный флажок (или объект со стейтом прокидывать через все вызовы по ссылке) и его возвращать в ответе.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants