为了更多地了解Python的对象和类,我为二进制搜索树编写了一些代码。
对于删除方法,当我尝试更改节点指向的内容时,python正在创建一个新变量,而不是更改传递给该方法的节点。我怎样才能更改方法中指向的节点?
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
答案 0 :(得分:0)
这不是python问题,对于使用指针的每一种语言(而不是c ++样式引用),这都是相同的。在删除操作期间,您应该将父节点引用的指针更改为其子项。你有一个结构
parent
/ \
node ...
/ \
child1 child2
删除node
时,您必须将父子项更改为新项目,而不是尝试将新值分配给&#34;节点&#34;变量,不指向任何地方。因此,你最终会得到类似的东西:
parent
/ \
child1 ...
/ \
child2 ...