美文网首页
二分搜索树的相关操作

二分搜索树的相关操作

作者: ___Qian___ | 来源:发表于2019-03-08 17:26 被阅读0次

    插入元素

    // 向以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;
            }
        }
    

    相关文章

      网友评论

          本文标题:二分搜索树的相关操作

          本文链接:https://www.haomeiwen.com/subject/lhkkpqtx.html