课后作业题,其它基本都教材和这里的系列已经给出答案,就不琢磨了,主要课后5-3习题的第三问,删除一个节点,思路要清晰,请参考算法导论第12章295页:
(1)如果删除的是根,则直接删除,测试图5.11中的节点8即可;
(2)如果节点是叶子,则直接删除,测试图5.11中的节点1即可;
(3)如果节点只有一个儿子,则将该节点的儿子赋值给其父节点,然后删除节点,测试图5.11中的节点14即可;
(4)如果节点两个儿子,则将其右子树的最小值代替次节点的数据,并将其右子树的最小数据删除。
代码如下:
def delete(self, key, *args):
node = self.find(key) #找到要删除的节点
parent = node.parent #找到要删除的节点的父节点
if node is None: #没有该节点
print("No this node!")
return
if node == self.Root: #要删除的节点是根节点
self.Root = None
return
if node.left is None: #要删除的节点左子树为空
if node == parent.left: #要删除的节点是父节点的左孩子,那么该节点的右孩子作为父节点的左孩子
parent.left = node.right
else:
parent.right = node.right
del node
elif node.right is None: #如果该节点左不空,右空
if node == parent.left: #如果该节点是父节点的左孩子
parent.left = node.left
else: #如果该节点是父节点的右孩子
parent.right = node.left
del node
else: #该节点左右都不为空
pre = node.right
if pre.left is None:
node.key = pre.key
node.right = pre.right
del pre
else:
next = pre.left
while next.left is not None:
pre = next
next = next.left
node.key = next.key
pre.left = next.right
del next
测试代码:
tree.delete(6)