对传递给函数的对象的引用 Python
Reference to object passed to function Python
为了进一步了解 Python 的对象和 类,我为二叉搜索树编写了一些代码。
对于 delete 方法,当我尝试更改节点指向的内容时,python 正在创建一个新变量,而不是更改传递给该方法的节点。我如何才能更改方法中指向的节点?[=12=]
class Node:
def __init__(self):
self.data = None
self.left = None
self.right = None
class BST:
def __init__(self):
self.root = None
self.length = 0
def insert(self, data):
if not self.root:
temp = Node()
temp.data = data
self.root = temp
else:
return self._insert(self.root, data)
def _insert(self, node, data):
if node.data <= data:
if not node.right:
temp = Node()
temp.data = data
node.right = temp
return
else:
self._insert(node.right, data)
else:
if not node.left:
temp = Node()
temp.data = data
node.left = temp
return
else:
self._insert(node.left, data)
def delete(self, data):
return self._delete(self.root, data)
def _delete(self, node, data):
if not node:
return False
elif node.data < data:
return self._delete(node.right, data)
elif node.data > data:
return self._delete(node.left, data)
else:
if not node.left and not node.right:
node = None
elif not node.left:
node = node.right
elif not node.right:
node = node.right
else:
temp = self.findmin(node.right)
#or find max of left
node.data = temp.data
self._delete(node.right, temp.data)
def findmin(self, node):
if not node:
return None
while node.left:
node = node.left
return node
这不是 python 问题,这对于使用指针(而不是 C++ 样式引用)的每种语言都是一样的。在删除操作期间,您应该将 父节点的 节点引用的指针更改为其子节点。你有一个形式的结构
parent
/ \
node ...
/ \
child1 child2
删除 node
时,您必须将 parent children 更改为新的,而不是尝试将新值分配给 "node" 变量,这不是指向任何地方。因此你最终会得到类似的东西:
parent
/ \
child1 ...
/ \
child2 ...
为了进一步了解 Python 的对象和 类,我为二叉搜索树编写了一些代码。
对于 delete 方法,当我尝试更改节点指向的内容时,python 正在创建一个新变量,而不是更改传递给该方法的节点。我如何才能更改方法中指向的节点?[=12=]
class Node:
def __init__(self):
self.data = None
self.left = None
self.right = None
class BST:
def __init__(self):
self.root = None
self.length = 0
def insert(self, data):
if not self.root:
temp = Node()
temp.data = data
self.root = temp
else:
return self._insert(self.root, data)
def _insert(self, node, data):
if node.data <= data:
if not node.right:
temp = Node()
temp.data = data
node.right = temp
return
else:
self._insert(node.right, data)
else:
if not node.left:
temp = Node()
temp.data = data
node.left = temp
return
else:
self._insert(node.left, data)
def delete(self, data):
return self._delete(self.root, data)
def _delete(self, node, data):
if not node:
return False
elif node.data < data:
return self._delete(node.right, data)
elif node.data > data:
return self._delete(node.left, data)
else:
if not node.left and not node.right:
node = None
elif not node.left:
node = node.right
elif not node.right:
node = node.right
else:
temp = self.findmin(node.right)
#or find max of left
node.data = temp.data
self._delete(node.right, temp.data)
def findmin(self, node):
if not node:
return None
while node.left:
node = node.left
return node
这不是 python 问题,这对于使用指针(而不是 C++ 样式引用)的每种语言都是一样的。在删除操作期间,您应该将 父节点的 节点引用的指针更改为其子节点。你有一个形式的结构
parent
/ \
node ...
/ \
child1 child2
删除 node
时,您必须将 parent children 更改为新的,而不是尝试将新值分配给 "node" 变量,这不是指向任何地方。因此你最终会得到类似的东西:
parent
/ \
child1 ...
/ \
child2 ...