Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST.
Basically, the deletion can be divided into two stages:
- Search for a node to remove.
- If the node is found, delete the node.
Note: Time complexity should be O(height of tree).
Example:
root = [5,3,6,2,4,null,7] key = 3 5 / \ 3 6 / \ \ 2 4 7 Given key to delete is 3. So we find the node with value 3 and delete it. One valid answer is [5,4,6,2,null,null,7], shown in the following BST. 5 / \ 4 6 / \ 2 7 Another valid answer is [5,2,6,null,4,null,7]. 5 / \ 2 6 \ \ 4 7自己写的时候把它写复杂了,纯粹是自己瞎写。左子树右子树搞来搞去,写的很慢。
public class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
TreeNode prvnode=new TreeNode(0);
prvnode.left=root;
TreeNode node=root;
while(node!=null&&node.val!=key){
if(node.val<key){
prvnode=node;
node=node.right;
}
else{
prvnode=node;
node=node.left;
}
}
if(node==null) return root;
if(node.left==null){ //没有左子树
if(prvnode.left==node){
prvnode.left=node.right;
}
else{
prvnode.right=node.right;
}
}
else{
if(node.right==null){ //没有右子树
if(prvnode.left==node){
prvnode.left=node.left;
}
else{
prvnode.right=node.left;
}
}else{ //有左子树也有右子树
if(prvnode.left==node){
prvnode.left=node.left;
}else{
prvnode.right=node.left;
}
TreeNode sonright=node.left.right;
node.left.right=node.right;
TreeNode p=node.right;
while(p.left!=null){
p=p.left;
}
p.left=sonright;
}
}
if(node==root){
return prvnode.left;
}
else return root;
}
}
数据结构与算法分析上的递归方法。好理解,简洁。写起来也不容易出错。
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null){
return null;
}
if(key < root.val){
root.left = deleteNode(root.left, key);
}else if(key > root.val){
root.right = deleteNode(root.right, key);
}else{
if(root.left == null){
return root.right;
}else if(root.right == null){
return root.left;
}
TreeNode minNode = findMin(root.right);
root.val = minNode.val;
root.right = deleteNode(root.right, root.val);
}
return root;
}
private TreeNode findMin(TreeNode node){
while(node.left != null){
node = node.left;
}
return node;
}