思路:先根据二叉搜索树的性质查找目标结点,找到之后判断这个节点左右子节点是否为空,都不为空:遍历左子树的右节点,找到最右的叶子结点作为新的根节点。
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null) return root;
if(key<root.val){
root.left=deleteNode(root.left,key);
}
else if(key>root.val){
root.right=deleteNode(root.right,key);
}
else{
TreeNode left=root.left;
TreeNode right=root.right;
if(left==null) return right;
else if(right==null) return left;
else {
TreeNode temp=left;
while(temp.right!=null){
temp=temp.right;
}
temp.right=right;
root=root.left;
}
}
return root;
}
思路:先根据二叉搜索树的性质查找目标结点,找到之后判断这个节点左右子节点是否为空,都不为空:遍历右子树的左节点,找到最左的叶子结点作为新的根节点
public TreeNode deleteNode(TreeNode root, int key){
if(root==null) return null;
if(key>root.val){
root.right=deleteNode(root.right,key);
}
else if(key<root.val){
root.left=deleteNode(root.left,key);
}
else {
if(root.left==null) return root.right;
else if(root.right==null) return root.left;
else if(root.left!=null&&root.right!=null){
TreeNode node=root.right;
while(node.left!=null){
node=node.left;
}
node.left=root.left;
root=root.right;
}
}
return root;
}