分为三种情况,没有左子节点,没有右子节点,有两个子节点。注意这种直接接到另一颗树后面的做法无法保持二叉树的平衡性
def deleteNode(self, root, key):
"""
:type root: TreeNode
:type key: int
:rtype: TreeNode
"""
if not root:
return
if root.val > key: #找要删除的节点
root.left = self.deleteNode(root.left,key) #注意这里需要有接收的
elif root.val < key:
root.right = self.deleteNode(root.right,key)
else: #找到要删除的节点了
if not root.left: #没有左子节点
return root.right #把右子节点填到删除节点那里
if not root.right: #没有右子节点
return root.left #把左子节点填到删除节点那里
node = root.left #可以把要删除节点的右子树接到左子树的最右节点的右子节点上
while node.right: #也可以把要删除节点的左子树接到右子树的最左节点左子节点上
node = node.right
node.right = root.right
root = root.left #返回改之后的子树
return root
return root
递归删除,和上面不一样的地方在于用左子树最大的节点或者用右子树最小的节点代替删除的节点。这样可以保证二叉树的平衡性
def deleteNode(self, root, key):
"""
:type root: TreeNode
:type key: int
:rtype: TreeNode
"""
def getmin(cur):
if not cur:
return
while cur.left:
cur = cur.left
return cur.val
if not root:
return
if root.val == key:
if not root.left:
return root.right
if not root.right:
return root.left
vall = getmin(root.right) #找右子树的最小节点代替
root.val = vall
root.right = self.deleteNode(root.right,vall) #这个时候最小节点没有左右子节点,所以直接被删了
elif root.val > key:
root.left = self.deleteNode(root.left,key)
else:
root.right = self.deleteNode(root.right,key)
return root
def deleteNode(self, root, key):
"""
:type root: TreeNode
:type key: int
:rtype: TreeNode
"""
def getmin(cur):
if not cur:
return
while cur.left:
cur = cur.left
return cur
if not root:
return
if root.val == key:
if not root.left:
return root.right
if not root.right:
return root.left
node = getmin(root.right) #找到右子树的最小值记录
root.right = self.deleteNode(root.right,node.val) #把这个右子树最小值删了
node.left = root.left #接上当前节点的左右子树
node.right = root.right #不能先换,那样就空了
root = node #把当前节点替换为最小的节点
elif root.val > key:
root.left = self.deleteNode(root.left,key)
else:
root.right = self.deleteNode(root.right,key)
return root