java - robert sedgwick的红黑树的delete操作是什么思路?
阿神
阿神 2017-04-18 09:35:17
0
2
519
阿神
阿神

闭关修行中......

membalas semua(2)
伊谢尔伦

Saya ingin memahami masalah ini... Ini adalah kod yang saya tulis untuk mensimulasikan pelaksanaan standard terlebih dahulu menentukan bahawa elemen itu wujud dalam pokok merah-hitam dan kemudian memadamkannya secara langsung, tanpa mengira sama ada ia wujud atau tidak. Tiada ujian lagi, tetapi ia pada asasnya sama dengan pelaksanaan kod standard


    public void delete(int num)
        {
            if(root == null)
                return ;
            if(!isRed(root.left) && !isRed(root.right))
                root.color = RED ;
            root = delete(root , num) ;
    
            if(root != null)
                root.color = BLACK ;
        }
 private Node delete(int key , Node node){   
   


    if(node == null)
        return null ;
    int cmp = node.key - key ;
    if(cmp > 0) //说明在他的左子树上
    {
        //说明是一个2-节点, 需要从右子树上借一个给他
        if(node.left != null && !isRed(node.left) && !isRed(node.left.left))
            node = moveRedLeft(node) ;
        node.left = delete(node.left , key) ;
    }
    else //说明key在右子树上
    {
        if(isRed(node.left))//说明该节点本身就是3-节点, 直接分一个给右子树即可
            node = rotateRight(node) ;
        if(cmp == 0 && node.right == null)
            return null ;
        //如果右节点是一个2-节点, 那么就从左子树上借一个给他
        if(node.right != null && !isRed(node.right) && !isRed(node.right.left))
            node = moveRedRight(node) ; //cmp失效, 重新计算
        cmp = node.key-key ;
        if(cmp == 0)
        {
            //和普通二叉树的删除相同, 将右子树的最小节点放在这个节点的位置
            Node x = min(node.right) ;
            node.key = x.key ;
            node.value = x.value ;
            //将原来的最小节点删除
            node.right = deleteMin(node.right) ;
        }
        else
        {
            node.right = delete(node.right , key) ;
        }
    }

        //维持红黑树的性质
        return balance(node) ;
    }

Idea pemadaman adalah serupa dengan idea memadam nilai minimum dan maksimum Pemikiran sebelumnya terhad kepada cara mensimulasikan pemadaman 2-3 pokok, mengakibatkan kegagalan untuk mengenali hubungan antara. mereka...

阿神

Saya ingin bertanya soalan kepada poster
Dalam proses beralih ke cawangan kanan dalam padam, kaedah moveRedRight dipanggil
Maafkan saya mengapa dalam kaedah moveRedRight
nod = rotateRight(nod );
flipColors (nod) ;
Mengapa tidak perlu melakukan putaran kiri selepas dua langkah ini?
Adalah munasabah bahawa warna node.right.right pada masa ini adalah merah, dan warna node.right.left adalah hitam, (baris ini Nod ialah nod yang diluluskan dalam kaedah padam) Bukankah putaran kiri perlu dilakukan pada masa ini?

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan