一、题目
二、代码
/**
* 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
{
boolean break_flag = false;
public void insert(TreeNode right, TreeNode left)
{
if(break_flag == true ) return;
if(right.left != null && right.val> left.val) insert(right.left,left);
if(right.left == null && right.val> left.val)
{
right.left = left;
break_flag = true;
}
if(right.right == null && right.val< left.val)
{
right.right = left;
break_flag = true;
}
if(right.right != null && right.val< left.val) insert(right.right,left);
}
//处理不了root 确实
public void recursion(TreeNode root, int key)
{
if(break_flag == true ) return;
if(root.left != null && root.val> key) recursion(root.left,key);
//处理代码
//先一步处理
if(root.left!=null&&root.left.val==key)
{
if(root.left.left == null &&root.left.right == null)
{
// System.out.println("两侧均为空");
root.left = null;
break_flag= true;
}
else if(root.left.left != null &&root.left.right == null)
{
// System.out.println("左侧不为空");
root.left = root.left.left;
break_flag= true;
}
else if(root.left.left == null &&root.left.right != null)
{
// System.out.println("右侧不为空");
root.left = root.left.right;
break_flag= true;
}
else
{
// System.out.println("两侧均不为空");
TreeNode temp_1 = root.left.left;
TreeNode temp_2 = root.left.right;
root.left.left = null;
root.left.right = null;
insert(temp_2,temp_1);
root.left = temp_2;
break_flag= true;
}
}
if(root.right != null && root.right.val == key)
{
if(root.right.left == null &&root.right.right == null)
{
// System.out.println("两侧均为空");
root.right = null;
break_flag= true;
}
else if(root.right.left != null &&root.right.right == null)
{
// System.out.println("左侧不为空");
root.right = root.right.left;
break_flag= true;
}
else if(root.right.left == null &&root.right.right != null)
{
// System.out.println("右侧不为空");
root.right = root.right.right;
break_flag= true;
}
else
{
// System.out.println("两侧均不为空");
TreeNode temp_1 = root.right.left;
TreeNode temp_2 = root.right.right;
root.right.left = null;
root.right.right = null;
insert(temp_2,temp_1);
root.right = temp_2;
break_flag= true;
}
}
if(root.right != null && root.val< key) recursion(root.right,key);
}
public TreeNode deleteNode(TreeNode root, int key)
{
if(root == null) return null;
if(root.val == key)
{
TreeNode temp_1 = root.left;
TreeNode temp_2 = root.right;
if(temp_1==null&&temp_2==null) return null;
else if(temp_1!=null&&temp_2==null) return temp_1;
else if(temp_1==null&&temp_2!=null) return temp_2;
else
{
insert(temp_2,temp_1);
return temp_2;
}
}
recursion(root, key);
return root;
}
}
三、运行结果
四、附录
二刷
/**
* 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
{
//思路是找到父节点 从父节点入手
//本身 左 右 分情况如下
boolean res = false;
public TreeNode deleteNode(TreeNode root, int key)
{
if(root == null) return null;
if(res == true) return null;
//这一部分只有可能是 第一次 进入
if(root.val == key )
{
if(root.left==null && root.right == null) return null;
else if(root.left==null&&root.right!=null) return root.right;
else if(root.left!=null && root.right==null ) return root.left;
else
{
//两者都不为空
//System.out.println(" all no null ");
TreeNode temp = root.right;
while(temp.left!=null) temp= temp.left; //找到最小值
temp.left = root.left;
return root.right;
}
}
// System.out.println(" node val" +root.val);
if(root.left!=null&&root.left.val == key)
{
//System.out.println(" find in the left" +root.left.val);
if(root.left.left == null &&root.left.right == null) root.left =null;
else if(root.left.left != null &&root.left.right == null ) root.left = root.left.left;
else if(root.left.left == null &&root.left.right != null ) root.left = root.left.right;
else
{
//左子树最大值已经有了 只需要找到右子树最小值
TreeNode temp = root.left.right;
while(temp.left!=null) temp = temp.left; //执行完毕 已经是右子树最小值了
temp.left = root.left.left;
root.left = root.left.right;
}
res = true;
}
if(root.right!=null&&root.right.val == key)
{
//System.out.println(" find in the right" +root.right.val);
if(root.right.left == null && root.right.right == null) root.right = null;
else if(root.right.left!=null && root.right.right==null) root.right = root.right.left;
else if(root.right.left == null && root.right.right !=null) root.right = root.right.right;
else
{
TreeNode temp = root.right.right;
// //每一个都分四种情况
while(temp.left!=null) temp = temp.left;
temp.left = root.right.left;
root.right = root.right.right;
}
res = true;
}
if(root.right!=null&&root.val<key) deleteNode(root.right,key);
if(root.left!=null&&root.val>key) deleteNode(root.left,key);
return root;
}
}