Итак, я сам изучаю деревья AVL, и я понимаю основную идею этого, но я просто хочу убедиться, что моя интуиция его реализации действительно:
Я рассмотрю его с левым вращением -
Итак, следующая ситуация проста:
8
/ \
7 10
/
6
/
3
Когда мы добавляем 3, дерево ребалансирует себя:
8
/ \
6 10
/ \
3 7
Но есть ли поворот, основанный на добавлении 3 или дисбалансе поддерева, внедренного в 7? Это даже основано на дисбалансе дерева, внедренного в 8?
В следующем примере, где, по-моему, все становится немного волосатым:
9
/ \
7 10
/ \
6 8
/
3
Итак, в этом случае поддерево в 7 отлично, когда добавляется 3, так что поддерево не нужно вращать. Однако дерево в 9 несбалансировано с добавлением 3, поэтому мы устанавливаем поворот на 9. Получаем:
7
/ \
6 9
/ / \
3 8 10
Итак, при написании моего кода, который я скоро буду, будет ли следующий код, начиная с небольших поддеревьев, работающих до больших поддеревьев, делает трюк?
псевдокод:
function balanceTree(Node n){
if (n is not null){
balanceTree(n.rightchild);
balanceTree(n.leftchild);
}
if (abs(balanceFactor(n))>1){
rotateAsNeeded(n);// rotate based on balance factor
}
}
Спасибо заранее!