Я полагаю, что с двумя дополнительными столбцами для хранения исходного значения правого и левого узлов (и всех последующих подузлов) алгоритм можно упростить. Я работал с примерами карандашом и бумагой, поэтому, если вы обнаружите какие-либо дыры в алгоритме, пожалуйста, дайте мне знать.
Целевым узлом (новым родительским узлом перемещаемого вами узла) является tNode. Левое значение целевого узла - tNode.L, а правое - tNode.R. Точно так же узел, который вы перемещаете, это mNode, а значения mNode влево и вправо - mNode.L и mNode.R. Два дополнительных столбца - это mNode.SL и mNode.SR
Итак, всего у нас есть 4 столбца для манипуляций R, L, SL и SR
Step1
Рассчитать
delta1 = (mNode.R - mNode.L) + 1
Step2
Сохранение оригинальных m и узлов L и R в столбцы SL и SR
- For All L between mNode.L and mNode.R
mNode.SL = mNode.L ; mNode.L = 0 ;
- For All R between mNode.L and mNode.R
mNode.SR = mNode.R ; mNode.R = 0 ;
Step3
Do For all Nodes
IF L > mNode.SR
L = L + delta1
IF R > mNode.SR
R = R + delta1
Теперь mNode отсоединен от Tree, и дерево настраивается без mNode.
Step4
Рассчитать
delta2 = (tNode.R - mNode.SL)
Step5
Do for all Nodes
IF L >= tNode.R
L = L + delta1
IF R >= tNode.R
R = R + delta1
Теперь мы настроили дерево (и целевой узел), чтобы принимать количество удаленных узлов.
Step6
Присоединить mNode к tNode и сбросить значения столбцов SL / SR
Do for all Nodes
IF SL between mNode.SL and mNode.SR
L = mNode.SL + delta2 ; mNode.SL = 0 ;
IF SR between mNode.SL and mNode.SR
R = mNode.SR + delta2 ; mNode.SR = 0 ;
После всех этих шагов мы должны были переместить mNode под tNode.