题目描述:给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。
一般来说,删除节点可分为两个步骤:
- 首先找到需要删除的节点
- 如果找到了,删除它。
var deleteNode = function(root, key) {
if(!root) return null
if(root.val === key){
// 如果删除的节点有单一左或者右子树
if(root.left === null) return root.right
if(root.right === null) return root.left
// 如果有左右子树,找到左子树最大值或者右子树最小值,然后删除
// 再把删除的val赋值给root.val
let next = root.right
// 找出右子树最小值
while(next.left) next = next.left
// 删除
root.right = deleteNode(root.right, next.val)
// 重新赋值
root.val = next.val
return root
}else if(root.val > key){
root.left = deleteNode(root.left, key)
}else if(root.val < key){
root.right = deleteNode(root.right, key)
}
return root
};