class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null) return null;
if(root.val > key) root.left = deleteNode(root.left,key);
else if (root.val < key) root.right = deleteNode(root.right,key);
else{
if(root.left == null && root.right == null) root = null;
else if(root.left != null){
//把当前节点值改为前驱结点,然后在左子树里删除这个节点。
root.val = predecessor(root);
root.left = deleteNode(root.left, root.val);
}else{
//把当前节点值改为后继节点,然后在右子树里删除这个节点。
root.val = successor(root);
root.right = deleteNode(root.right, root.val);
}
}
return root;
}
//寻找后继节点
public int successor(TreeNode node){
node = node.right;
while(node.left != null) node = node.left;
return node.val;
}
//寻找前驱节点
public int predecessor(TreeNode node){
node = node.left;
while(node.right != null) node = node.right;
return node.val;
}
}
450. 删除二叉搜索树中的节点
最新推荐文章于 2023-09-20 22:06:10 发布