首页 > 解决方案 > 如何从类内部更改对象?

问题描述

我想编写几个数据结构,我目前的目标是在 BST 中旋转。不久前我设法做到了,但是通过更改几个节点的值而不是更改节点本身。这是我最初想到的:

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 是关于节点的另一个类,等等。

然而,在做伸展树时,我需要做几个这样的旋转,这可能会成为一个问题,因为如果我想伸展一个节点,我需要对它做几个旋转,但节点会指向在同一个地方,例如,为了在一个节点上进行 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 = node.left,它不会改变节点指向的位置,它只是改变局部变量节点。

标签: pythonoopdata-structurestreebinary-search-tree

解决方案


推荐阅读