二分搜索树的相关操作

2019-03-08  本文已影响0人  ___Qian___

插入元素

// 向以node为根的二分搜索树中插入元素e,递归算法
    private void add(Node node, E e){
        if(e.equals(node.e))  //已存在
            return;
        else if(e.compareTo(node.e) < 0 && node.left == null){   //比当前子树根节点小,且子树左孩子为空
            node.left = new Node(e);  //插入至左孩子
            size ++;
            return;
        }
        else if(e.compareTo(node.e) > 0 && node.right == null){   //比当前子树根节点大,且子树右孩子为空
            node.right = new Node(e);  //插入至右孩子
            size ++;
            return;
        }

      //当前子树左右孩子位置不空,没有能插入的位置,则递归地在左右子树中寻找插入位置
        if(e.compareTo(node.e) < 0)
            add(node.left, e);
        else  //e.compareTo(node.e) > 0
            add(node.right, e);
    }

删除最小节点

// 删除掉以node为根的二分搜索树中的最小节点
    // 返回删除节点后新的二分搜索树的根
    private Node removeMin(Node node){

        if(node.left == null){
            Node rightNode = node.right;
            node.right = null;
            size --;
            return rightNode;
        }

        node.left = removeMin(node.left);
        return node;
    }

删除最大节点

// 删除掉以node为根的二分搜索树中的最大节点
    // 返回删除节点后新的二分搜索树的根
    private Node removeMax(Node node){

        if(node.right == null){
            Node leftNode = node.left;
            node.left = null;
            size --;
            return leftNode;
        }

        node.right = removeMax(node.right);
        return node;
    }

删除值为e的节点

// 删除掉以node为根的二分搜索树中值为e的节点, 递归算法
    // 返回删除节点后新的二分搜索树的根
    private Node remove(Node node, E e){

        if( node == null )
            return null;

        if( e.compareTo(node.e) < 0 ){
            node.left = remove(node.left , e);
            return node;
        }
        else if(e.compareTo(node.e) > 0 ){
            node.right = remove(node.right, e);
            return node;
        }
        else{   // e.compareTo(node.e) == 0

            // 待删除节点左子树为空的情况
            if(node.left == null){
                Node rightNode = node.right;
                node.right = null;
                size --;
                return rightNode;
            }

            // 待删除节点右子树为空的情况
            if(node.right == null){
                Node leftNode = node.left;
                node.left = null;
                size --;
                return leftNode;
            }

            // 待删除节点左右子树均不为空的情况

            // 找到比待删除节点大的最小节点, 即待删除节点右子树的最小节点
            // 用这个节点顶替待删除节点的位置
            Node successor = minimum(node.right);
            successor.right = removeMin(node.right);
            successor.left = node.left;

            node.left = node.right = null;

            return successor;
        }
    }
上一篇下一篇

猜你喜欢

热点阅读