Если я правильно помню домашнюю работу по структурам данных:
Что вы делаете, это сохраняете коэффициент баланса в самом узле в виде целого числа, которое либо:
- -1: левое поддерево узла - это уровень выше правого (левый-тяжелый)
- 0 узел сбалансирован;или
- 1 правое поддерево выше (правое тяжелое).
Функция вставки (поддерево узла) возвращает логическое значение, которое имеет значение true, если при вставке высота поддерева увеличилась.Вы обновляете коэффициент баланса и перебалансируете дерево по мере того, как вы возвращаетесь из рекурсивных вызовов insert ().
Вероятно, это лучше всего объяснить на нескольких примерах:
Если текущий узел имеет коэффициент баланса -1 , вы вставляете в поддерево right , и вставка (rchild) возвращает true , вы:
- обновить коэффициент баланса текущего узла до 0 - левое поддерево было выше перед вставкой, а высота правого поддерева увеличилась, поэтому теперь они имеют ту же высоту;и
- return false - высота более мелкого дерева увеличилась, поэтому высота текущего узла остается неизменной
Если вы вставляете в либо поддерево, и insert (…) возвращает false :
- коэффициент баланса текущего узла не изменяется - высоты поддеревато же самое, что и раньше, и то же самое происходит с балансом
- return false - высота поддерева не изменилась, равно как и текущая высота узла
Если коэффициент баланса текущего узла равен 0 , вы вставляете в поддерево left , а insert (lchild) возвращает true :
- коэффициент баланса изменяется на -1 - поддеревья были одинаковой высоты перед вставкой, а вставка сделала левое более высокое
- return true
(Аналогично, если вставить правильное поддерево, коэффициент баланса изменится на 1.)
Если коэффициент баланса текущего узла равен -1 , вы вставляете в поддерево left , а insert (lchild) возвращает true:
Коэффициент баланса изменится на -2, что означает, что вы должны перебалансировать узел, выполнив соответствующее вращение.Я признаю, что нарисую пробел в том, что каждое из четырех вращений будет делать с коэффициентом баланса, и что вернет insert (current), надеюсь, предыдущие примеры объясняют подход к достаточному отслеживанию баланса узлов.