本题分为以下几种情况:
- 树中没有要删除的节点返回null
- 要删除的节点是叶子节点(左右子树都为空)直接删除
- 要删除的节点的左子树不为空,右子树为空,返回左子树
- 要删除的节点右子树不为空,左子树为空,返回右子树
- 要删除的节点的左右子树都不为空,把该节点的左子树放到右子树的最左边的位置,返回右子树
public TreeNode deleteNode(TreeNode root, int key) {
if(root==null) return root;
// 当该节点是要删除的节点时
if(root.val==key){
// 当该节点是叶子节点,直接删除
if(root.left==null &&root.right==null){
return null;
}
// 左子节点不为空,右节点为空,返回左节点
else if(root.left!=null && root.right==null){
return root.left;
}
// 左节点不为空,右节点为空,返回右节点
else if(root.left==null && root.right!=null){
return root.right;
}
// 左右节点都不为空,则把左子树放在右子树最左边的位置上
else if(root.left!=null && root.right!=null){
TreeNode temp = new TreeNode();
temp = root.right;
while(temp.left!=null){
temp = temp.left;
}
temp.left = root.left;
return root.right;
}
}
// 递归遍历左右子树
root.left = deleteNode(root.left,key);
root.right = deleteNode(root.right,key);
return root;
}