Я ищу лучший способ для расчета баланса узлов в AVL-дереве . Я думал, что у меня это работает, но после некоторой тяжелой вставки / обновления я вижу, что это не работает правильно (вообще).
Это вопрос из двух частей, первая часть будет о том, как вычислить высоту поддерева, я знаю определение "Высота узла - это длина самого длинного пути вниз на лист с этого узла. " и я понимаю, но я не могу реализовать его. И чтобы еще больше сбить меня с толку, эту цитату можно найти в википедии на высотах деревьев "Обычно значение -1 соответствует поддереву без узлов, тогда как ноль соответствует поддереву с одним узлом."
И вторая часть - это получение коэффициента баланса поддерева в дереве AVL, у меня нет проблем с пониманием концепции, "получим высоту ваших L
и R
вложенных элементов. деревья и вычтите R
из L
". И это определяется примерно так: BALANCE = NODE[L][HEIGHT] - NODE[R][HEIGT]
Чтение в Википедии говорит об этом в первых нескольких строках, описывающих вставки в дерево AVL: "Если коэффициент баланса становится равным -1, 0 или 1, тогда дерево все еще находится в форме AVL, и вращений не требуется . "
Затем он продолжает, говоря это "Если коэффициент баланса становится равным 2 или -2, тогда дерево, укорененное в этом узле, является несбалансированным, и требуется вращение дерева. В большинстве случаев потребуется одиночное или двойное вращение чтобы уравновесить дерево. " - который я без проблем поймал.
Но (да, всегда есть но).
Вот где это сбивает с толку, текст гласит: «Если коэффициент баланса R равен 1, это означает, что вставка произошла на (внешней) правой стороне этого узла, и необходим левый поворот», Но из моего понимания в тексте сказано (как я цитировал), что если коэффициент баланса был в пределах [-1, 1]
, то тогда балансировка не нужна?
Я чувствую, что настолько близок к пониманию концепции, что я свернул древовидную структуру, реализовал обычное двоичное дерево поиска и на грани схватывания AVL-деревьев, но, похоже, просто упускаю это существенное прозрение.
Редактировать: Примеры кода предпочтительнее академических формул, поскольку мне всегда было легче понять что-то в коде, но любая помощь очень ценится.
Редактировать: Хотелось бы пометить все ответы как "принятые", но для меня ответ Ника был первым, который заставил меня сказать "ага".