Сам работаю над написанием красно-черного дерева. Но когда я проверяю вращение, которое включает в себя вращение корня, оно несколько теряет связь.
Древовидная структура:
45
/ \
40x 70
/ \ /
7 41 50
/ \
6 39
Логика поворота говорит: «Повернуть с 45 (корень) в качестве вершины в направлении, которое поднимает X (т.е. 40)».
Итак, это означает правое вращение, и результат должен выглядеть так:
40x
/ \
7 45
/ \ / \
6 39 41 70
/
50
Предположим, что узел 45 является прародителем, узел 7 — родителем, а узел 41 — текущим. (Я знаю, что порядок не имеет смысла, но, пожалуйста, не обращайте внимания, потому что я уже менялся один раз)
Код:
//current is node 45
//parent is node 7
//grandparent is node 45 (root)
//first detach cross node (i.e. 41)
Node crossNode2 = grandparent.left.right;
grandparent.left.right = null; //detach
45
/ \
40x 70
/ \ /
7 null 50
/ \
6 39
grandparent.left = null;
45
/ \
null 70
/
50
current.right = grandparent;
40
/ \
7 45
/ \ / \
6 39 null 70
/
50
grandparent.left = crossNode2; //attach
40
/ \
7 45
/ \ / \
6 39 41 70
/
50
Но почему-то этот код не работает. Когда я тестировал:
preorder
45, 39, 70, 50
breadth-first
45, 39, 70, 50
Итак, я думаю, что результат на самом деле:
45
/ \
39 70
/
50
Может ли кто-нибудь дать мне советы, что не так с моим кодом вращения?