class Node:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class BST:
def __init__(self, root=None):
self.root = root
def remove(self, val):
if self.root == None:
return root
else:
self._remove(val, self.root)
def _remove(self, val, node):
if node == None:
return node # Item not found
if val < node.val:
self._remove(val, node.left)
elif val > node.val:
self._remove(val, node.right)
else:
# FOUND NODE TO REMOVE
if node.left != None and node.right != None: # IF TWO CHILDREN
node.val = self._find_min(node.right)
node.right = self._remove(node.val, node.right)
else: # ZERO OR ONE CHILD
if node.left == None: # COVERS ZERO CHILD CASE
node = node.right
elif node.right == None:
node = node.left
return node
无法弄清楚为什么此功能不会删除某些值。我调试了print语句,可以看到如果尝试删除值,该函数将进入else块并成功删除具有两个子节点的节点。但是,当尝试删除一个有一个或零个子节点的节点时,代码将正确执行,但是当我打印树以查看其内容时,该节点仍然存在。
要删除的节点将至少有一个None子节点,并且将节点设置为其右(或左)子节点似乎很简单,我假设将节点设置为None。
我对Java有一定的经验,但是对Python来说还很陌生,有时我会遇到“自我”协议的麻烦,但是我认为情况并非如此。