Rakau Binary me pehea ranei te whakarite rakau rapu rua

MoTopokowha

Ko tenei tuhinga mo nga rakau rapu rua. No tata nei i mahia e au tetahi tuhinga mo kōpeketanga raraunga mā te whakamahi i te tikanga Huffman. I reira kaore au i aro nui ki nga rakau rua, na te mea ko nga tikanga rapu, whakauru, me te whakakorenga kaore i te whai kiko. Inaianei kua whakatau ahau ki te tuhi tuhinga mo nga rakau. Kia timata tatou.

Ko te rakau he hanganga raraunga kei roto i nga pona e honoa ana e nga tapa. Ka taea te kii he take motuhake te rakau o te kauwhata. Anei he tauira rakau:

Rakau Binary me pehea ranei te whakarite rakau rapu rua

Ehara tenei i te rakau rapu rua! Kua tapahia nga mea katoa!

Te Terminology

Hua

Puaka rakau - koinei tona node runga rawa. I roto i te tauira, ko te node A tenei. I roto i te rakau, kotahi noa te ara ka arahi mai i te putake ki tetahi atu pona! Ko te tikanga, ka taea te whakaaro ko tetahi node ko te putake o te rakau iti e rite ana ki tenei node.

Maatua/ uri

Ko nga pona katoa haunga te putake he tapatahi tonu te tapa e ahu atu ana ki tetahi atu pona. Ko te node kei runga ake i te waa ka kiia matua tenei node. Ka karangahia he node kei raro iho i te onāianei ka hono atu ki a ia uri tenei node. Me whakamahi he tauira. Ka tango tatou i te pona B, katahi ko ona matua hei ponga A, ko ana tamariki hei ponga D, E me F.

Rau

Ko te node karekau he tamariki ka kiia he rau o te rakau. I roto i te tauira, ka noho nga rau D, E, F, G, I, J, K.

Ko te kupu matua tenei. Ka matapakihia ano etahi atu ariā. Na, ko te rakau-rua he rakau kaore e neke ake i te rua nga tamariki o ia pona. Ka rite ki to whakaaro, ko te rakau mai i te tauira karekau e rua, na te mea he nui ake i te rua nga tamariki node B me H. Anei tetahi tauira o te rakau rua:

Rakau Binary me pehea ranei te whakarite rakau rapu rua

Kei roto i nga kopuku rakau nga korero. Ko te rakau rapu rua he rakau rua e whai ake nei nga ahuatanga:

  1. Ko nga rakau iti maui me te matau he rakau rapu rua.
  2. Ko nga pona katoa o te taha maui o te riu o te node X he uara matua raraunga iti iho i te uara o te ki raraunga o te node X ake.
  3. Ko nga pona katoa kei te taha matau o te node X he uara matua raraunga nui ake, he rite ranei ki te uara o te taviri raraunga o te node X ake.

— tetahi ahuatanga o te node (hei tauira, he tau). Kei te hiahiatia te kī kia kitea e koe te huānga rakau e hāngai ana ki tēnei kī. He tauira o te rakau rapu rua:

Rakau Binary me pehea ranei te whakarite rakau rapu rua

Tirohanga rakau

I a tatou e anga whakamua ana, ka hoatu e ahau etahi (kaore pea i oti) nga waahanga waehere hei whakapai ake i to maaramatanga. Kei te mutunga o te tuhinga te waehere katoa.

He node te rakau. Hanganga kōpuku:

public class Node<T> {
    private T data;
    private int key;
    private Node<T> leftChild;
    private Node<T> rightChild;

    public Node(T data, int key) {
        this.data = data;
        this.key = key;
    }
    public Node<T> getLeftChild() {
        return leftChild;
    }

    public Node<T> getRightChild() {
        return rightChild;
    }
//...остальные методы узла
}

E rua nga tamariki o ia pona (kaore pea he uara kore te tamaiti maui me/ranei Tamariki matau). I mohio pea koe i roto i tenei keehi ko nga raraunga tau ko nga raraunga kei te rongoa i roto i te node; kī — kī kōpuku.

Kua whakatauhia e matou te pona, inaianei me korero mo nga raru e pa ana ki nga rakau. Hei muri ake nei, ko te kupu "rakau" ko te tikanga o te rakau rapu rua. Hanganga rakau-rua:

public class BinaryTree<T> {
     private Node<T> root;

    //методы дерева
}

Ko te putake o te rakau hei mara karaehe anake e hiahiatia ana, na te mea mai i te putake, ma te whakamahi i nga tikanga getLeftChild() me te getRightChild(), ka taea e koe te uru ki tetahi node o te rakau.

Algorithm i roto i te rakau

Поиск

Me kii he rakau kua oti te hanga. Me pēhea te kimi i tētahi huānga me te kī matua? Me nuku haere mai i te pakiaka ki raro i te rakau ka whakataurite i te uara o te matua ki te ki o te node e whai ake nei: mena he iti iho te ki o te node e whai ake nei, katahi ka haere ki te uri maui o te node, mena he nui ake, ki te taha matau, mena he rite nga ki, ka kitea te node e hiahiatia ana! Waehere hāngai:

public Node<T> find(int key) {
    Node<T> current = root;
    while (current.getKey() != key) {
        if (key < current.getKey())
            current = current.getLeftChild();
        else
            current = current.getRightChild();
        if (current == null)
            return null;
    }
    return current;
}

Mēnā ka kore te nāianei, kua tae te rapunga ki te pito o te rākau (i te taumata ariā, kei te wāhi kore koe i roto i te rākau - he tamaiti rau).

Kia whai whakaaro tatou ki te whai huatanga o te rapu algorithm i runga i te rakau taurite (he rakau e tohatohahia ai nga pona he iti ake ranei). Na ko te pai o te rapunga ko O(takiuru(n)), ko te taukohiko te turanga 2. Titiro: mena he n huānga kei roto i te rakau taurite, ko te tikanga tenei ka puta he roko(n) ki te turanga e 2 nga taumata o te rakau. A, i roto i te rapu, i tetahi taahiraa o te huringa, ka heke koe i tetahi taumata.

kōkuhu

Mena ka mau koe ki te ngako o te rapunga, kare he uaua ki a koe te mohio ki te whakaurunga. Me heke iho koe ki tetahi rau o te rakau (e ai ki nga tikanga whakahekenga e whakaahuatia ana i te rapunga) ka noho hei uri - maui, matau ranei, i runga i te ki. Whakatinana:

   public void insert(T insertData, int key) {
        Node<T> current = root;
        Node<T> parent;
        Node<T> newNode = new Node<>(insertData, key);
        if (root == null)
            root = newNode;
        else {
            while (true) {
                parent = current;
                if (key < current.getKey()) {
                    current = current.getLeftChild();
                    if (current == null) {
                         parent.setLeftChild(newNode);
                         return;
                    }
                }
                else {
                    current = current.getRightChild();
                    if (current == null) {
                        parent.setRightChild(newNode);
                        return;
                    }
                }
            }
        }
    }

I tenei keehi, i tua atu i te node o naianei, me penapena nga korero mo te matua o te node o naianei. Ina ka rite te au ki te null, kei roto i te taurangi matua te rau e hiahiatia ana.
Ko te kaha o te whakaurunga ka tino rite ki tera o te rapu - O(log(n)).

Mukua

Ko te tangohanga te mahi tino uaua me mahi ki runga rakau. E marama ana ko te tuatahi me rapu tatou i te huānga ka mukua. Engari ka pehea? Mena ka tautuhi noa tatou i tana tohutoro ki te null, ka ngaro nga korero mo te subtree ko tenei node te putake. Ka wehewehea nga tikanga tango rakau kia toru nga wahanga.

Take tuatahi. Ko te node e mukua ana kaore he tamariki

Mena kaore he tamariki o te node e whakakorehia ana, ko te tikanga he rau. Na reira, ka taea e koe te tautuhi noa i te taha mauiChild, rightChild ranei a tona matua ki te kore.

Take tuarua. Kotahi te tamaiti o te node ka mukua

Ko tenei keehi kaore ano i te tino uaua. Kia hoki ki to tatou tauira. Me kii me mukua tetahi huānga whai matua 14. Whakaae mai i te mea ko te uri tika o te pona me te matua 10, katahi o ona uri (i tenei keehi ko te mea matau) ka nui ake i te 10, no reira koe ka ngawari te "tapahi" mai i te rakau, ka hono tika i te matua ki te tamaiti o te node e mukua ana, ara. honoa te node ki te matua 10 ki te node 13. Ka rite te ahuatanga mehemea ka tika kia mukua tetahi node ko te tamaiti maui o tona matua. Whakaarohia e koe ake - he whakataurite tika.

Take tuatoru. Tokorua nga tamariki a tetahi node

Ko te keehi tino uaua. Ka titiro tatou ki tetahi tauira hou.

Rakau Binary me pehea ranei te whakarite rakau rapu rua

Rapua he kairiiwhi

Me kii me mukua he node me te matua 25. Ko wai hei whakakapi? Ko tetahi o ana apataki (nga uri, uri ranei o nga uri) me noho kai-riiwhi(ko te tangata ka tango i te waahi o te pona ka tangohia).

Me pehea te mohio ko wai hei whakakapi? Ma te mohio, he node tenei i roto i te rakau ko tona ki te mea nui rawa atu i te pona e mukua ana. Ko te algorithm e whai ake nei. Me haere koe ki tana uri katau (i nga wa katoa ki te taha matau, na te mea kua kiia ake he nui ake te kii whakakapi i te ki o te pona e mukua ana), katahi ka haere ma te mekameka o nga uri maui o tenei uri matau. . I roto i te tauira, ka haere matou ki te pona me te ki 35, katahi ka heke ki te rau ma te mekameka o ana tamariki maui - i tenei keehi, ko tenei mekameka ko te pona me te ki 30 anake. mo te node iti rawa i roto i te huinga o nga node nui ake i tera e rapuhia ana e tatou mo te node.

Rakau Binary me pehea ranei te whakarite rakau rapu rua

Waehere aratuka rapu kairiiwhi:

    public Node<T> getSuccessor(Node<T> deleteNode) {
        Node<T> parentSuccessor = deleteNode;//родитель преемника
        Node<T> successor = deleteNode;//преемник
        Node<T> current = successor.getRightChild();//просто "пробегающий" узел
        while (current != null) {
            parentSuccessor = successor;
            successor = current;
            current = current.getLeftChild();
        }
        //на выходе из цикла имеем преемника и родителя преемника
        if (successor != deleteNode.getRightChild()) {//если преемник не совпадает с правым потомком удаляемого узла
            parentSuccessor.setLeftChild(successor.getRightChild());//то его родитель забирает себе потомка преемника, чтобы не потерять его
            successor.setRightChild(deleteNode.getRightChild());//связываем преемника с правым потомком удаляемого узла
        }
        return successor;
    }

Waehere katoa mo te tikanga muku:

public boolean delete(int deleteKey) {
        Node<T> current = root;
        Node<T> parent = current;
        boolean isLeftChild = false;//В зависимости от того, является ли  удаляемый узел левым или правым потомком своего родителя, булевская переменная isLeftChild будет принимать значение true или false соответственно.
        while (current.getKey() != deleteKey) {
            parent = current;
            if (deleteKey < current.getKey()) {
                current = current.getLeftChild();
                isLeftChild = true;
            } else {
                isLeftChild = false;
                current = current.getRightChild();
            }
            if (current == null)
                return false;
        }

        if (current.getLeftChild() == null && current.getRightChild() == null) {//первый случай
            if (current == root)
                current = null;
            else if (isLeftChild)
                parent.setLeftChild(null);
            else
                parent.setRightChild(null);
        }
        else if (current.getRightChild() == null) {//второй случай
            if (current == root)
                root = current.getLeftChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getLeftChild());
            else
                current.setRightChild(current.getLeftChild());
        } else if (current.getLeftChild() == null) {
            if (current == root)
                root = current.getRightChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getRightChild());
            else
                parent.setRightChild(current.getRightChild());
        } 
        else {//третий случай
            Node<T> successor = getSuccessor(current);
            if (current == root)
                root = successor;
            else if (isLeftChild)
                parent.setLeftChild(successor);
            else
                parent.setRightChild(successor);
        }
        return true;
    }

Ka taea te tata ki te O(log(n)) te matatini.

Te kimi morahi/iti rawa i roto i te rakau

Ka kitea me pehea te rapu i te uara iti/mōrahi o te rākau - me nuku haere koe i te mekameka o nga huānga maui/matau o te rakau, ia; ka tae koe ki te rau, ko te huānga iti/mōrahi.

    public Node<T> getMinimum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getLeftChild();
        }
        return parent;
    }

    public Node<T> getMaximum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getRightChild();
        }
        return parent;
    }

Matatini - O(takiuru(n))

te hipa hangarite

Kei te toro atu a Traversal ki ia kohanga o te rakau kia mahia etahi mahi.

Te hātepe hātepe hātepe hangarite:

  1. Mahia he mahi ki te tamaiti maui
  2. Mahia he mahi ki a koe ano
  3. Mahia he mahi mo te tamaiti tika

Waehere:

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");//Здесь может быть все, что угодно
            inOrder(current.getRightChild());
        }
    }

mutunga

Ka mutu! Mena kaore au i whakamarama i tetahi mea, he korero ranei, waiho mai i roto i nga korero. Ka rite ki te korero, ka whakaratohia e ahau te waehere katoa.

Node.java:

public class Node<T> {
    private T data;
    private int key;
    private Node<T> leftChild;
    private Node<T> rightChild;

    public Node(T data, int key) {
        this.data = data;
        this.key = key;
    }

    public void setLeftChild(Node<T> newNode) {
        leftChild = newNode;
    }

    public void setRightChild(Node<T> newNode) {
        rightChild = newNode;
    }

    public Node<T> getLeftChild() {
        return leftChild;
    }

    public Node<T> getRightChild() {
        return rightChild;
    }

    public T getData() {
        return data;
    }

    public int getKey() {
        return key;
    }
}

BinaryTree.java:

public class BinaryTree<T> {
    private Node<T> root;

    public Node<T> find(int key) {
        Node<T> current = root;
        while (current.getKey() != key) {
            if (key < current.getKey())
                current = current.getLeftChild();
            else
                current = current.getRightChild();
            if (current == null)
                return null;
        }
        return current;
    }

    public void insert(T insertData, int key) {
        Node<T> current = root;
        Node<T> parent;
        Node<T> newNode = new Node<>(insertData, key);
        if (root == null)
            root = newNode;
        else {
            while (true) {
                parent = current;
                if (key < current.getKey()) {
                    current = current.getLeftChild();
                    if (current == null) {
                         parent.setLeftChild(newNode);
                         return;
                    }
                }
                else {
                    current = current.getRightChild();
                    if (current == null) {
                        parent.setRightChild(newNode);
                        return;
                    }
                }
            }
        }
    }

    public Node<T> getMinimum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getLeftChild();
        }
        return parent;
    }

    public Node<T> getMaximum(Node<T> startPoint) {
        Node<T> current = startPoint;
        Node<T> parent = current;
        while (current != null) {
            parent = current;
            current = current.getRightChild();
        }
        return parent;
    }

    public Node<T> getSuccessor(Node<T> deleteNode) {
        Node<T> parentSuccessor = deleteNode;
        Node<T> successor = deleteNode;
        Node<T> current = successor.getRightChild();
        while (current != null) {
            parentSuccessor = successor;
            successor = current;
            current = current.getLeftChild();
        }

        if (successor != deleteNode.getRightChild()) {
            parentSuccessor.setLeftChild(successor.getRightChild());
            successor.setRightChild(deleteNode.getRightChild());
        }
        return successor;
    }

    public boolean delete(int deleteKey) {
        Node<T> current = root;
        Node<T> parent = current;
        boolean isLeftChild = false;
        while (current.getKey() != deleteKey) {
            parent = current;
            if (deleteKey < current.getKey()) {
                current = current.getLeftChild();
                isLeftChild = true;
            } else {
                isLeftChild = false;
                current = current.getRightChild();
            }
            if (current == null)
                return false;
        }

        if (current.getLeftChild() == null && current.getRightChild() == null) {
            if (current == root)
                current = null;
            else if (isLeftChild)
                parent.setLeftChild(null);
            else
                parent.setRightChild(null);
        }
        else if (current.getRightChild() == null) {
            if (current == root)
                root = current.getLeftChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getLeftChild());
            else
                current.setRightChild(current.getLeftChild());
        } else if (current.getLeftChild() == null) {
            if (current == root)
                root = current.getRightChild();
            else if (isLeftChild)
                parent.setLeftChild(current.getRightChild());
            else
                parent.setRightChild(current.getRightChild());
        } 
        else {
            Node<T> successor = getSuccessor(current);
            if (current == root)
                root = successor;
            else if (isLeftChild)
                parent.setLeftChild(successor);
            else
                parent.setRightChild(successor);
        }
        return true;
    }

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");
            inOrder(current.getRightChild());
        }
    }
}

PS

Te whakaheke ki te O(n)

He maha pea o koutou i kite: ka pewhea mehemea ka kore e taurite te rakau? Hei tauira, hoatu nga pona me nga taviri piki ake ki roto i te rakau: 1,2,3,4,5,6... Na ka ahua rite te rakau ki te rarangi hono. Ae, ka ngaro te rakau i tona hanganga rakau, na reira te pai o te uru raraunga. Ko te uaua o nga mahi rapu, whakauru, me te whakakore ka rite ki tera o te rarangi hono: O(n). Koinei tetahi o nga mea tino nui, ki taku whakaaro, ko nga huakore o nga rakau rua.

Ko nga kaiwhakamahi kua rehita anake ka uru ki te rangahau. Waitohu maitēnā.

Kare au i noho ki te tari mo te wa roa, ka hiahia au ki te mohio he aha nga tuhinga mo nga kaupapa e pirangi ana koe ki te kite atu?

  • Nga hanganga raraunga

  • Algorithms (DP, recursion, kōpeketanga raraunga, etc.)

  • Te whakamahi i nga hanganga raraunga me nga algorithms i roto i te ao tuuturu

  • Papatono tono Android i Java

  • Papatono tono tukutuku i Java

2 nga kaiwhakamahi i pooti. 1 nga kaiwhakamahi i aukati.

Puna: www.habr.com

Tāpiri i te kōrero