python - 如何从类内部更改对象?
问题描述
我想编写几个数据结构,我目前的目标是在 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,它不会改变节点指向的位置,它只是改变局部变量节点。
解决方案
推荐阅读
- c# - 如何在 ASP.NET MVC 网站上使用 IronPython
- python - 泛型、类和实例
- python - Python 聊天应用程序:“尝试对非套接字的操作进行操作”
- python - 如何正确阅读 discord 上的嵌入消息?
- unity3d - OnCollisionEnter 触发时更改文本
- c - 从文件中读取数据并在排序后将其写入文件
- python - os.rename() 的问题 - 获取 [WinError 5] 访问被拒绝:
- angular - 在 .ts 文件中设置 Angular 属性
- node.js - React 客户端使用 Socket.io 接收两个连接
- firebase - Flutter:StreamBuilder流未更新