450.删除二叉树中的节点
给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
首先找到需要删除的节点;
如果找到了,删除它。
说明: 要求算法时间复杂度为 O(h),h 为树的高度。
示例:
root = [5,3,6,2,4,null,7]
key = 3
5
/ \
3 6
/ \ \
2 4 7
给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。
5
/ \
4 6
/ \
2 7
另一个正确答案是 [5,2,6,null,4,null,7]。
5
/ \
2 6
\ \
4 7
中序立即先行者:在该节点的左子树往右寻找,直到该节点的右子针为None,这个节点就是中序立即先行者。
中序立即后继者:该节点的右子树往左寻找,直到左子针的为None.
伪代码
MinNode(x)
'''
返回后继者
'''
if x.left == NIL
return x
return MinNode(x.left)
DeleteMin(ptr)
'''
主程序
'''
'''
返回删除了后继者的右子树
'''
if ptr.left == NIL
return ptr.right
ptr.left = DeleteMin(ptr.left)
return ptr
DeleteNode(root,key)
if root == NIL#如果树根为NIL,就返回NIL
return NIL
if root.val > key#如果key在左子树中,就修改root的左子树
root.left = DeleteNode(root.left,key)
return root
else lif root.val < key#如果key在右子树中,就修改root的右子树
root.right = DeleteNode(root.right,key)
return root
else:
#如果key就是在root
##如果key只有左子树,就返回它的左子树
if root.right == NIL
return root.left
##反之如果key只有右子树,就返回它的右子树
else lif root.left == NIL
return root.right
## 如果root,有两个子树,可以返回root的先行者或者后继者,这里以后继者为例
else:
succnode = MinNode(root.right)#succnode是后继者
succnode.right = DeleteMin(root.right)#返回删除了后继者的右子树
succnode.left = root.left #后继者的左子树就是树根的左子树
return succnode #返回后继者
python实现
class Solution(object):
def deleteNode(self, root, key):
"""
:type root: TreeNode
:type key: int
:rtype: TreeNode
"""
def minnode(x):
'''
返回最小关键字
'''
if x.left == None:
return x
return minnode(x.left)
def deleteMin(ptr):
'''
反回删除了最小关键字的二叉树
'''
if ptr.left == None:
return ptr.right
ptr.left = deleteMin(ptr.left)
return ptr
if root == None:
return None
if root.val > key:
#如果key在左子树中
root.left = self.deleteNode(root.left,key)
return root
elif root.val < key:
#如果key在右子树中
root.right = self.deleteNode(root.right,key)
return root
else:
#如果key在root上
## 如果root只有左子树
if root.right == None:
return root.left
## 如果root只有右子树
elif root.left == None:
return root.right
## root有两个子树,返回root的后继
else:
succnode = minnode(root.right)
succnode.right = deleteMin(root.right)
succnode.left = root.left
return succnode