二叉搜索树

二叉搜索树的查找

-原理

在这里插入图片描述

 public static Integer get(int key){
        BinarySearchNode cur = root;
        while(cur != null){
            if(key < cur.key){
                cur = cur.left;
            }
            else if(key > cur.key){
                cur = cur.right;
            }else {
                return cur.val;
            }
        }
        return null;
    }

二叉搜索树的插入

-原理

在这里插入图片描述

public static void put(int key, int val){
        //判断空树的情况
        if(root == null){
            root = new BinarySearchNode(key, val);
            return;
        }
        BinarySearchNode parent = null;
        BinarySearchNode cur = root;
        // 找末尾
        while(cur != null){
            if(key < cur.key){
                parent = cur;
                cur = cur.left;
            }
            else if(key >cur.key){
                parent = cur;
                cur = cur.right;
            }else{
                //找的途中发现了相同key的元素, 直接把新的val放到旧的key中即可
                cur.val = val;
                return;
            }
        }
        //找到了末尾, 这时判断新节点要放到父亲节点的左边还是右边
        BinarySearchNode newNode = new BinarySearchNode(key, val);
        if(newNode.key < parent.key){
            parent.left = newNode;
        }else{
            parent.right = newNode;
        }
        return;
    }

二叉搜索树的删除

-原理

在这里插入图片描述

在这里插入图片描述

public static void remove(int key){
        //先查找该key对应的是哪个节点
        BinarySearchNode cur = root;
        BinarySearchNode parent = null;
        while(cur != null){
            if(key < cur.key){
                parent = cur;
                cur = cur.left;
            }
            else if(key > cur.key){
                parent = cur;
                cur = cur.right;
            }else{
                removeNode(parent, cur);
                return;
            }
        }
    }

    private static void removeNode(BinarySearchNode parent, BinarySearchNode cur) {
        //这里就是那三种情况
        if(cur.left == null){
            // 1.要删除的节点没有左子树
            if(cur == root){
                // 1.1 要删除的节点是根节点
                root = cur.right;
            }
            else if(cur == parent.right){
                // 1.2 要删除的节点是它父亲节点的右子树
                parent.right = cur.right;
            }else if(cur == parent.left){
                // 1.3 要删除的节点是它父亲节点的左子树
                parent.left = cur.right;
            }
        }
        else if(cur.right == null){
            // 2. 要删除的节点没有右子树
            if(cur == root){
                // 2.1 要删除的节点为根节点
                root = cur.left;
            }
            else if(cur == parent.right){
                // 2.2 要删除的节点是它父亲节点的右子树
                parent.right = cur.left;
            }else if(cur == parent.left){
                // 2.3 要删除的节点是它父亲节点的左子树
                parent.left = cur.left;
            }
        }else{
            // 3. 要删除的节点左右子树都非空
            // 3.1 先在右子树中找到最小值
            BinarySearchNode goat = cur.right;
            BinarySearchNode goatparent = cur;
            while(goat.left != null){
                goatparent = goat;
                goat = goat.left;
            }
            // 3.2 把找到的替罪羊节点的内容赋给待删除节点
            cur.key = goat.key;
            cur.val = goat.val;
            // 3.3 这时删除原来的替罪羊节点即可
            if(goat == goatparent.right){
                goatparent.right = goat.right;
            }else{
                goatparent.left = goat.right;
            }
        }
    } // removeNode end
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值