Я хочу запрограммировать несколько структур данных, и моей целью на данный момент является ротация в BST. Мне удалось сделать это некоторое время go, но изменив значения нескольких узлов и не меняя сами узлы. Это то, что я придумал, изначально:
def _right_rotation(self, node):
a = node.data
z = node.right
node.data = node.left.data
node.right = Node(a)
if not isinstance(node.left.right, Null_leaf):
node.left.right.parent = node.right
node.right.parent = node
node.right.left = node.left.right
node.right.right = z
node.right.right.parent = node.right
node.right.left.parent = node.right
node.left = node.left.left
node.left.parent = node
Надеюсь, код не требует пояснений. node.parent - родительский узел, Node - другой класс, относящийся к узлу, и т. д. c.
Однако при выполнении Splay Trees, где мне нужно будет выполнить несколько таких вращений, это может стать проблемой, потому что если я хочу развернуть узел, мне нужно будет сделать несколько поворотов, но узел будет указывать на одно и то же место и, например, сделать 2 поворота на одном узле, Я должен позвонить
self._right_rotation(node.parent)
self._left_rotation(node.parent.parent)
Но это на самом деле не изменит родителей, и есть случаи, когда Узел будет родителем и прародителем самого себя.
Поэтому я попытался сделать это:
def _right_rotation(self, node):
a = node.data
z = node.right
y = node.left.right
node.left.parent = node.parent
node = node.left
node.right = Node(a)
node.right.parent = node
node.right.right = z
node.right.right.parent = node.right
node.right.left = y
node.right.left.parent = node.right
Надеюсь, вы увидите, что я пытаюсь сделать здесь, и я знаю, в чем проблема. Например, говоря, что node = node.left, я изменяю только узел локальной переменной, но фактически не изменяю сам узел. Ребята, можете ли вы помочь мне с этим?
Я больше не показываю код (например, для воспроизведения узла), потому что это часть задания, и я бы хотел сделать это сам.
Редактировать:
Добавление примера, чтобы он стал более понятным:
tree = BST()
tree.insert([20,10,25,100,37,73]) #it just inserts nodes into a BST. The
#root is 20
tree._right_rotation(tree.root) #performs a right rotation on tree.root.
#the root is 10, and the nodes are
#changed in conformity
Однако, если я использую вторую версию _right_rotation, само дерево не изменится Так как существует различие между произнесением node.data = node.left.data, которое фактически изменяет node.data вне функции, и высказыванием node = node.left, которое не меняется в том месте, на которое указывает узел, оно просто изменяет узел локальной переменной.