思路如下:先找到这个节点,然后删除它。用一个递归来实现,用返回值来实现删除策略
删除它又要分情况:
1. 它是叶子节点,那直接返回null就好
2. 它左边是空,右边不是空,那直接返回右边节点
3. 左边不是空,右边是空,返回左边节点
4. 左右都不是空,那就把左边子节点转移到右子树小的节点的左子结点上,然后返回右子节点。这里右子树最小节点,其实就是右边节点的左下角那个节点。
代码如下:
public TreeNode deleteNode(TreeNode root, int key) {
if (root==null ) return null;
//找到这个节点
if (root.val==key){
//情况1
if (root.left==null&&root.right==null) return null;
//情况2
if (root.left==null&&root.right!=null) return root.right;
//情况3
if (root.right==null&&root.left!=null) return root.left;
//情况4
else {
TreeNode rightNode=root.right;
TreeNode leftNode=root.left;
while (rightNode.left!=null) rightNode=rightNode.left;
rightNode.left=leftNode;
return root.right;
}
}
if (root.val>key) root.left=deleteNode(root.left,key);
if (root.val<key) root.right=deleteNode(root.right,key);
return root;
}