困扰了我两个晚上的代码 后来看了第一名的提交 懂了 现在写注释如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def deleteNode(self, root, key):
"""
:type root: TreeNode
:type key: int
:rtype: TreeNode
"""
parent = None
node = root
while (node and node.val != key):
parent = node
if node.val > key:
node = node.left
else:
node = node.right
# parent始终为父节点
# not found
if not node:
return root
# node does't has child
elif not node.left and not node.right:
# not root
if parent:
if parent.left == node:
parent.left = None
else:
parent.right = None
return root
# root
return None #只有一个根 并且根就是要删除的值
# node has two children
elif node.left and node.right: #用node与左子树最大的节点交换(或者用node与右子树最小的节点交换) 最后删除最小或者最大的节点
pre_parent = node
pre = node.left
while pre.right:
pre_parent = pre
pre = pre.right
if pre_parent != node: #经过while循环 导致pre_parent不是node
pre_parent.right = pre.left #将左子树最大节点用最大节点的左孩子代替 因为是最大的所以没有右孩子
node.val = pre.val #将最大节点的值与要删除的节点的值做替换
else:
node.val = pre.val #值交换
node.left = pre.left #将最大值(因为没有右子树所以就是pre)删除 删除的方法就是:用该节点的左子树代替
return root
# node only has one child
else:
if parent:
if parent.left == node:
parent.left = node.left or node.right
else:
parent.right = node.left or node.right
return root
else:
return node.left or node.right