二叉搜索树(复习)

插入数据

    boolean put(int val){//二叉搜索树插入数据
        if(root==null){
            root = new BSTNode(val);
            return true;
        }
        BSTNode cur = root;
        BSTNode temp = cur;
        while (cur!=null){
            if(val<cur.val){
                temp = cur;
                cur = cur.left;
            }else if(val>cur.val){
                temp=cur;
                cur = cur.right;
            }else {
                return true;
            }
        }
        if(temp.val>val){//这里需注意
            temp.left = new BSTNode(val);return true;
        }else{
            temp.right = new BSTNode(val);return true;
        }
    }

编写时易出错点
以上圈住部分有逻辑漏洞

查找数据

boolean contains(int val){
        if(root==null){
            return false;
        }
        BSTNode cur = root;
        while (cur!=null){
            if(val<cur.val){
                cur = cur.left;
            }else if(val>cur.val){
                cur = cur.right;
            }else {
                return true;
            }
        }
        return false;
    }

此部分相对比较简单

删除数据

难点思路

//cur的左右孩子均存在的话
//在cur子树中找一个替代的节点删除
//方式一:在其右子树中找最小的节点:即最左侧节点
//方式二:在其左子树中找最大的节点:即最右侧节点

我自己想了两种办法(cur的左右孩子均存在)
一种是将删除节点的左子树替换为该节点,将他的右子树放在左子树最右的节点下
一种是将删除节点的右子树替换为该节点,将他的右左子树放在右子树最左的节点下
//这种思路我没有去实现,因为这种思路会加深树的深度

boolean remove(int val){
        if(root==null){
            return false;
        }
        BSTNode cur = root;
        BSTNode temp = cur;

        while (cur!=null){
            if(val<cur.val){
                temp = cur;
                cur = cur.left;
            }else if(val>cur.val){
                temp = cur;
                cur = cur.right;
            }else {
               if(cur.left==null&&cur.right==null){//删除的是叶子节点
                   if(cur==root){//要删除的是根节点
                       root = null;
                       return true;
                   }
                   if(temp.left==cur){

                       temp.left=cur.left;
                   }else {
                       temp.right=cur.right;
                   }
                   return true;
                }else if(cur.right!=null&&cur.left==null){//删除节点无左子树
                   if(cur==root) {//要删除的是根节点
                       System.out.println(root.val);
                       root = root.right;
                       System.out.println(root.val);
                       return true;
                   }
                   if(temp.right==cur){
                        temp.right = cur.right;return true;
                    }else {
                        temp.left = cur.right;return true;
                    }
                }else if(cur.right==null&&cur.left !=null){//删除节点无右子树
                   if(cur==root){//要删除的是根节点
                       root = root.left;
                       return true;
                   }
                   if(temp.right==cur){
                       temp.right = cur.left;return true;
                   }else {
                       temp.left = cur.left;return true;
                   }
               }else {//删除节点左右子树都有
                       BSTree left = new BSTree();
                       left.root = cur.left;
                       int n = left.maxNode().val;
                       remove(n);
                       cur.val =n;
                       return true;
                     /*  BSTree right = new BSTree();
                       right.root = cur.right;
                       int n = right.minNode().val;
                       remove(n);
                       cur.val = n;
                       return true;*/
                }
            }
        }
        return false;
    }

写代码时出错的地方

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值