Дерево козла отпущения, возможно, имеет самый простой алгоритм определения баланса для понимания. Если какая-либо вставка заставляет новый узел быть слишком глубоким, он находит узел, вокруг которого можно балансировать, глядя на баланс веса, а не на баланс высоты. Правило для перебалансировки при удалении также прост. Он не хранит тайную информацию в узлах. Это сложнее доказать, что это правильно, но вам не нужно это понимать алгоритм ...
Однако, в отличие от AVL, он не всегда сбалансирован по высоте. Подобно красно-черному, его дисбаланс ограничен, но в отличие от красно-черных он настраивается с параметром, поэтому для большинства практических целей он выглядит сбалансированным, как вам нужно. Я подозреваю, что если вы настроите его слишком сильно, все же он окажется плохим или хуже, чем AVL для наихудших вставок.
Ответ на вопрос Отредактируйте
я приведу свой личный путь к пониманию AVL деревья.
Сначала вы должны понять, что такое ротация дерева, поэтому игнорируйте все остальное, что вы когда-либо слышали алгоритмы AVL, и понимаете это. Возьмите прямо в голову, которая является правильным вращением и которая является левым поворотом, и что каждый делает с деревом, или описания точных методов просто смутят вас.
Далее следует понимать, что трюк для балансировки деревьев AVL заключается в том, что каждый узел записывает в нем разницу между высотой его левого и правого поддеревьев. Определение «сбалансированный по высоте» заключается в том, что это значение составляет от -1 до 1 включительно для каждого узла в дереве.
Далее, поймите, что если вы добавили или удалили узел, вы можете разбалансировать дерево. Но вы можете изменить баланс узлов, которые являются предками узла, который вы добавили или удалили. Итак, что вы собираетесь делать, это сделать свой путь обратно в дерево, используя повороты, чтобы сбалансировать любые неуравновешенные узлы, которые вы найдете, и обновить их баланс, пока дерево не будет сбалансировано снова.
Заключительная часть понимания заключается в том, чтобы найти достойную ссылку для конкретных поворотов, используемых для балансировки каждого найденного вами узла: это «техника» этого, а не высокая концепция. Вам нужно запомнить данные только при изменении кода дерева AVL или, возможно, во время экзаменов структур данных. Прошло много лет с тех пор, как в последний раз я видел в дереве код AVL настолько же открытым, как и в отладчике - реализации, как правило, доходят до того, что они работают, а затем продолжают работать. Поэтому я действительно не помню. Вы можете сортировать работу на столе с помощью нескольких покерных фишек, но трудно быть уверенным, что у вас действительно есть все случаи (их немного). Лучше всего посмотреть.
Тогда есть бизнес, переводящий все это в код.
Я не думаю, что просмотр кодовых списков очень помогает с любой стадией, кроме последней, поэтому игнорируйте их. Даже в лучшем случае, когда код явно написан, он будет выглядеть как учебное описание процесса, но без диаграмм. В более типичном случае это беспорядок манипуляции с C-структурой. Так что просто придерживайтесь книг.
Вы хотите, чтобы дерево * прекрасно * сбалансировано? Наиболее распространенные алгоритмы гарантируют, что дерево несколько сбалансировано. Например, красно-черные деревья гарантируют, что глубина самого глубокого листового узла не более чем в два раза больше глубины самого мелкого листового узла. – 2008-09-25 14:23:26
Кроме того, вы ищете алгоритм, который берет дерево и балансирует его, или тот, который балансирует как часть операции дерева, такие как вставка, удаление и т. д. – 2008-09-25 14:24:31
«отлично», конечно, должно быть определено. Однако в контексте двоичных деревьев единственным значимым определением является бинарное дерево с логарифмической высотой, не так ли? – 2008-09-25 14:28:05