力扣刷题记录 -- JAVA--61---450. 删除二叉搜索树中的节点


一、题目

在这里插入图片描述
在这里插入图片描述

二、代码

/**
 * 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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@白圭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值