删除节点可以分三种情况:
- 被删除节点为叶子节点,此时只需要直接删除即可;
- 被删除节点含有一个子节点,此时可以将该节点的子节点替换掉该节点,即将子节点的引用赋值给被删除节点的父节点;
- 被删除节点含有左子树和右子树,此时可以利用左子树的最大节点或右子树的最小节点来替换掉被删除节点。
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null)return null;
else if(key<root.val){
root.left = deleteNode(root.left, key);
return root;
}else if(key>root.val){
root.right = deleteNode(root.right, key);
return root;
}else{
//找到被删除节点
if(root.left == null){
return root.right;
}else{
if(root.right == null){
return root.left;
}else{
TreeNode n = findMin(root.right);
n.right = deleteNode(root.right, n.val);
n.left = root.left;
return n;
}
}
}
}
public TreeNode findMin(TreeNode node){
if(node.left==null)return node;
return findMin(node.left);
}
}