我已经实现了二叉搜索树的删除功能。这个想法是声明一个私有函数,它需要一个额外的参数来将self.root
抽象为root
。在私人删除功能中,它会进行条件检查并确保root
等于需要删除的数据。在条件检查后,我编写了3种不同的删除情况。编译代码时没有错误消息,也没有删除任何插入的节点。在python中的二叉搜索树中实现删除的麻烦
class Node(object):
def __init__(self, data, left=None, right=None, parent=None):
self.left = left
self.data = data
self.right = right
class Tree(object):
def __init__(self):
self.root = Node(None)
def delete(self,newData):
if self.root.data == None:
print 'The tree is empty'
else:
self.__delete(self.root, newData)
def __delete(self, root, newData):
# if newData smaller than root.data, change root to root.left, recursive call
if newData < root.data:
if root.left:
self.__delete(root.left, newData)
else:
return False
# if newData larger than root.data, change root to root.right, recursive call
elif newData > root.data:
if root.right:
self.__delete(root.right, newData)
else:
return False
elif newData == root.data:
#case 1, root has no child
if root.left is None and root.right is None:
root = None
#case 2, root has one child (left)
elif root.left is not None and root.right is None:
root.data = root.left.data
root.left = None
#case 3, root has one child (right)
elif root.right is not None and root.left is None:
root.data = root.right.data
root.right = None
#case 4, root has both children,
# find the smallest node in the right subtree, and swipe value
# delete smallest node in the right subtree
else:
root.data = self.__minValueToRightSubtree(root.right).data
self.__deleteMinValueToRightSubtree(root.right)
else:
print "Can't find this number"
def __minValueToRightSubtree(self, root):
if root.left is None:
return root
else:
return self.__minValueToRightSubtree(root.left)
def __deleteMinValueToRightSubtree(self, root):
if root.left is None:
root = None
return root
else:
self.__minValueToRightSubtree(root.left)
这段代码错了,您不期待什么?我可以告诉你,情况2和3的根删除是错误的,因为当你试图删除根时,你保留'root.left'和'root.right'指针。 –
嘿。因此,我认为在这些情况下,将数据从'root.left.data'或'root.right.data'复制到'root.data',并删除左/右节点。这段代码没有收到任何错误消息,代码也没有做任何事情,所以我非常无知。你能否详细说明为什么第2/3个案在阅读我的过程之后出现错误 –
阅读了这个...... elif root.right不是None并且root.left是None,然后阅读这个'root.left = None' –