Leetcode 450.删除二叉搜索树中的节点
1 题目描述(Leetcode题目链接)
给定一个二叉搜索树的根节点 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
2 题解
二叉搜索树节点的删除方法。详见二叉搜索树。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def minimum(self, y, y_parent):
while y.left:
y_parent = y
y = y.left
return y, y_parent
def transplant(self, pre, u, v):
if not pre:
return 1
elif u == pre.left:
pre.left = v
else:
pre.right = v
return 0
def deleteNode(self, root: TreeNode, key: int) -> TreeNode:
pre = None
target = root
while target and target.val != key:
pre = target
if key > target.val:
target = target.right
else:
target = target.left
if not target:
return root
if not target.left:
new = self.transplant(pre, target, target.right)
if new: root = target.right
elif not target.right:
new = self.transplant(pre, target, target.left)
if new: root = target.left
else:
y, y_parent = self.minimum(target.right, target)
if target != y_parent:
self.transplant(y_parent, y, y.right)
y.right = target.right
new = self.transplant(pre, target, y)
if new: root = y
y.left = target.left
return root