思路
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
// 第一种情况:root为空,直接返回空
if(root == null) return null;
// 根据二叉搜索树性质,如果root.val > key 就去左子树中找,root.val < key 就去右子树中去找
if(root.val > key) root.left = deleteNode(root.left, key);
else if(root.val < key) root.right = deleteNode(root.right, key);
else{ // 如果找到了key,对应的节点x
// 情况二,x的左右子树都为空
if(root.left == null && root.right == null) {
return null;
}
// 情况三,x的做子树为空,则直接返回右子树
if(root.left == null) {
return root.right;
}
// 情况四,x的右子树为空,则直接返回左子树
if(root.right == null) {
return root.left;
}
// 情况五,x的左右子树都不为空,则将左子树,接到右子树的最左节点的左孩子处
// x设置为其右节点(相当于删除root),然后返回即可
TreeNode rightNode = root.right;
while(rightNode.left != null) {
rightNode = rightNode.left;
}
rightNode.left = root.left;
root = root.right;
}
return root;
}
}