об операции вставки дерева AVL

В стандартном процессе вставки дерева AVL после того, как мы вставим новый узел, мы будем выполнять настройку снизу вверх, и во время процесса возможно ли увеличение высоты поддерева на единицу (из-за операции вставки и поворота), в то время как поддерево (после увеличения высоты на единицу) по-прежнему имеет одинаковую высоту левого/правого дочернего элемента? Если да, то пример приветствуется, а если нет, то было бы здорово, если бы кто-нибудь объяснил, почему. Спасибо. :)

Вот ссылка на дерево AVL (https://en.wikipedia.org/wiki/AVL_tree )

С уважением, Лин


person Lin Ma    schedule 23.03.2016    source источник
comment
Можете быть более конкретными?   -  person ferit    schedule 24.03.2016
comment
@Saibot, добавьте ссылку на дерево AVL. Я думаю, что дерево не может увеличиться на 1, сохраняя баланс (левый/правый), ребенок имеет одинаковую высоту. Но могу ошибаться, прошу совета. Если мой вопрос все еще не ясен, пожалуйста, дайте мне знать, какие части не ясны. Спасибо. :)   -  person Lin Ma    schedule 24.03.2016
comment
(Короткий ответ: Невозможно. Поворот используется, если большее поддерево увеличивается в высоту и дает поддерево исходной высоты. Чтобы увеличить высоту родственных поддеревьев, вставьте более одного узла.) Пожалуйста, определите имена для задействованных узлов и деревьев, как в …, могут быть как поддеревьями l , так и r одного узла a ‹вставить предварительно - и постусловия для высот используя имена, определенные.   -  person greybeard    schedule 26.03.2016
comment
@greybeard, хороший улов. Проголосуйте и, как и ваше описание того, когда происходит вращение, конечный результат: дерево будет иметь одинаковую высоту левого/правого дочернего элемента, но высота не будет увеличена. Если вращение не задействовано, можно ли добиться того, чтобы после вставки (1) дерево имело одинаковую высоту левого/правого дочернего элемента, (2) общая высота дерева увеличилась на единицу?   -  person Lin Ma    schedule 27.03.2016


Ответы (2)


После вставки невозможно, чтобы левый и правый потомки поддерева оставались одинаковыми при изменении высоты.

Давайте рассмотрим простой пример только с ‹3 узлами в поддереве. Возможные факторы баланса:

  • +1 - это корневой узел в поддереве с 1 левым дочерним элементом и без правого дочернего элемента.
  • -1 - это корневой узел в поддереве с 1 правым дочерним элементом и без левого дочернего элемента.
  • 0 - Корневой узел в поддереве имеет по 1 узлу справа и слева.

Для поддерева с коэффициентом баланса +1,

  • если мы вставляем в право, мы в порядке
  • если мы вставляем в левый, коэффициент баланса изменится на 2. Поэтому нам нужно сбалансировать дерево, и в этом случае высота поддерева изменится.

Для поддерева с коэффициентом баланса -1,

  • если мы вставляем в левый, мы в порядке
  • если мы вставляем в правую, коэффициент баланса изменится на -2. Поэтому нам нужно сбалансировать дерево, и в этом случае высота поддерева изменится.

Для поддерева с коэффициентом баланса 0,

  • если мы вставляем в левый, мы в порядке. Высота изменена, но также изменен и дочерний узел.
  • если мы вставляем в право, мы в порядке. Высота изменена, но также изменен и дочерний узел.

Таким образом, невозможно изменить высоту и по-прежнему иметь одинаковую высоту правого и левого дочерних элементов.

person Ashraff Ali Wahab    schedule 28.03.2016
comment
(Этот ответ страдает от той же проблемы, что и вопрос: каждый узел в дереве можно считать корнем поддерева. Без идентификации узлов (с дополнительной информацией о до или после модификации, которая может изменить корень множества узлов) или, что то же самое, поддеревьев, говоря о the subtree совершенно двусмысленно.) - person greybeard; 28.03.2016
comment
Вы можете взять поддерево, объясненное в ответе, как целое дерево. Концепция останется прежней, и вы не сможете вставлять с изменением высоты и при этом сохранять высоту дочерних узлов неизменной. Если вы не согласны, то, пожалуйста, приведите пример, в котором вы можете доказать, что высота корневого узла может быть изменена и при этом сохранить высоту левого и правого дочерних элементов. - person Ashraff Ali Wahab; 28.03.2016
comment
@AshraffAliWahab, хороший ответ, голосуйте. Каково ваше точное определение интактности, вы имеете в виду одинаковую высоту левого и правого ребенка? Или вы имеете в виду сохранить исходный коэффициент баланса (-1, 0 или +1)? - person Lin Ma; 29.03.2016
comment
@greybeard, хороший улов, да, я имею в виду узел, и использовать узел лучше. Голосуйте за свои комментарии. Если у вас есть мысли по моему вопросу, заранее благодарю за совет. :) - person Lin Ma; 29.03.2016
comment
@Lin Ma, неповрежденный означает тот же рост. - person Ashraff Ali Wahab; 29.03.2016
comment
Спасибо, Ашраф, за то, что пациент объяснил мне, отметил ваш ответ как ответ и присудил бонусные очки. :) - person Lin Ma; 01.04.2016

На странице двоичного дерева Википедии:

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

Одной из распространенных сбалансированных древовидных структур является бинарная древовидная структура, в которой левое и правое поддеревья каждого узла отличаются по высоте не более чем на 1.

Например:

Это сбалансированное дерево.

введите здесь описание изображения

И если мы вставим 1, его высота увеличится на 1. Тем не менее, это снова сбалансированное дерево. Потому что левое и правое поддеревья отличаются по высоте не более чем на 1.

введите здесь описание изображения

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

Мне кажется, вы неправильно используете термин сбалансированный. Вы считаете сбалансированным отсутствие разницы в росте, но это не более 1 разницы в высоте в определении.

Ваш вопрос:

В стандартном процессе вставки дерева AVL возможно ли увеличение высоты поддерева на единицу (из-за операции вставки и поворота), в то время как поддерево (после увеличения высоты на единицу) по-прежнему имеет ту же высоту слева/ правильный ребенок?

Если бы у нас было дерево, имеющее одинаковую высоту с левой и правой ветвей, и если бы мы вставили узел в листовой узел на левой ветви, высота увеличилась бы, потому что высота дерева равна maximum(height(left_branch, right_branch)). Потому что после этой операции height(left_branch) равно height(right_branch)+1. Значит, они не могут быть равны.

Короче говоря, ваше предварительное условие height(left_branch) == height(right_branch)

Ваша операция increasing height of left_branch by 1

Таким образом, условие height(left_branch) == height(right_branch) больше не может быть правдой.

person ferit    schedule 24.03.2016
comment
Спасибо, Сайбот, голосуйте. Да, когда я говорю о балансе, я имею в виду, можно ли иметь одинаковую высоту левого и правого поддеревьев. На самом деле мой вопрос заключается в том, что в стандартном процессе вставки дерева AVL возможно ли увеличение высоты поддерева на единицу, в то время как поддерево (после увеличения высоты на единицу) по-прежнему имеет одинаковую высоту левого/правого дочернего элемента? Ваш совет приветствуется, и я также исправлю свой первоначальный вопрос. :) - person Lin Ma; 24.03.2016
comment
@LinMa Дайте мне знать, если этого объяснения вам недостаточно, в этом случае я могу привести примеры. - person ferit; 26.03.2016
comment
Спасибо Saibot за подробности и голосование. :) Для ваших комментариев: если бы у нас было дерево, имеющее одинаковую высоту от левой и правой ветвей, я думаю, что здесь есть проблема с предположением. До вставки узла дерево могло быть либо левым потомком выше правого, либо наоборот, кроме сбалансированного. Итак, я думаю, что ваш анализ, основанный на этом предположении, не на 100% верен. Я могу ошибаться, и, пожалуйста, не стесняйтесь меня поправлять. - person Lin Ma; 27.03.2016
comment
Кстати, Saibot, мой вопрос больше о после вставки нового узла, возможно ли, что дерево увеличит высоту на единицу, сохраняя при этом одинаковую высоту левого/правого дочернего элемента? И он не предполагает перед вставкой нового узла, независимо от того, был ли в дереве левый дочерний элемент выше, правый дочерний элемент выше или такой же высоты. - person Lin Ma; 27.03.2016
comment
Но вы говорите, что у левого / правого ребенка все еще одинаковая высота? до сих пор означает, что разница высот была 0, и будет ли она снова равна 0. Если разница высот в начале не равна нулю, вставка нового узла, конечно, сделает ее равной 0. Я думаю, вы не ясно, о чем вы спрашиваете. Может быть, вам следует отредактировать свой вопрос, приведя пример, чтобы четко выразить себя? - person ferit; 27.03.2016
comment
Спасибо, Сайбот. Я переписываю часть своего вопроса, если мой вопрос все еще не ясен, пожалуйста, дайте мне знать, спасибо. В стандартном процессе вставки дерева AVL после того, как мы вставим новый узел, мы выполним настройку снизу вверх , и во время процесса возможно ли увеличение высоты поддерева на единицу (из-за операции вставки и поворота), в то время как поддерево (после увеличения высоты на единицу) по-прежнему имеет одинаковую высоту левого/правого дочернего элемента? - person Lin Ma; 28.03.2016
comment
Кстати, для ваших комментариев, все еще имеют одинаковую высоту левого/правого ребенка? по-прежнему означает, что разница в высоте была 0, и будет ли она снова равна 0, я имею в виду, что перед вставкой поддерево может иметь баланс +1, 0 или -1, но после вставки высота поддерева увеличивается на единицу, и имеет баланс 0, возможно ли это? Ваш совет высоко ценится. - person Lin Ma; 28.03.2016
comment
Да возможно и не редкость, если я правильно понимаю. Если вы хотите убедиться, что я понимаю, о чем вы спрашиваете, приведите примеры деревьев. Объяснение на английском сбивает с толку. - person ferit; 28.03.2016