Как я могу изменить объекты внутри класса? - PullRequest
0 голосов
/ 01 марта 2020

Я хочу запрограммировать несколько структур данных, и моей целью на данный момент является ротация в 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, которое не меняется в том месте, на которое указывает узел, оно просто изменяет узел локальной переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...