Binary Tree kana nzira yekugadzirira bhinari yekutsvaga muti

Prelude

Ichi chinyorwa chiri pamusoro pemiti yekutsvaga yebhinari. Ini nguva pfupi yadarika ndakaita chinyorwa nezve kudzvanya data uchishandisa nzira yeHuffman. Ikoko handina kubhadhara zvakanyanya kumiti yemabhinari, nokuti kutsvaga, kuisa, uye nzira dzokubvisa dzakanga dzisina basa. Zvino ndakasarudza kunyora chinyorwa pamusoro pemiti. Ngatitangei.

Muti chimiro che data chinosanganisira nodes dzakabatana nemicheto. Tinogona kutaura kuti muti inyaya yakakosha yegirafu. Heino muenzaniso muti:

Binary Tree kana nzira yekugadzirira bhinari yekutsvaga muti

Iyi haisi yebhinari yekutsvaga muti! Zvese zvakatemwa!

Terminology

Root

Mudzi wemuti - iyi ndiyo node yayo yepamusoro. Mumuenzaniso, iyi node A. Mumuti, nzira imwe chete inogona kutungamirira kubva pamudzi kuenda kune imwe node! Muchokwadi, chero node inogona kutorwa semudzi weiyo subtree inoenderana neiyi node.

Vabereki/vazukuru

Manodhi ese kunze kwemudzi ane mupendero chaiwo unoenda kune imwe node. Iyo node iri pamusoro peiyo iripo inonzi mubereki node iyi. Node iri pasi peyazvino uye yakabatana nayo inonzi muzukuru node iyi. Ngatishandisei muenzaniso. Ngatitorei node B, ipapo mubereki wayo achava node A, uye vana vayo vachava node D, E naF.

Leaf

Node isina vana ichanzi shizha remuti. Mumuenzaniso, mashizha achava nodes D, E, F, G, I, J, K.

Iri ndiro izwi rekutanga. Dzimwe pfungwa dzichakurukurwa mberi. Saka, muti webhinari muti umo node imwe neimwe inenge isina vana vanopfuura vaviri. Sezvawakafungidzira, muti kubva pamuenzaniso hauzove webhinari, nokuti nodes B uye H vane vana vanopfuura vaviri. Heino muenzaniso webinary tree:

Binary Tree kana nzira yekugadzirira bhinari yekutsvaga muti

Miti yemiti inogona kunge ine chero ruzivo. Muti webhinari yekutsvaga muti webhinari une zvinotevera:

  1. Ose ari maviri kuruboshwe uye kurudyi subtrees ibhinari yekutsvaga miti.
  2. Manode ese eruboshwe subtree yeanopokana node X ane data kiyi yakakosha yakaderera pane kukosha kwekiyi data yenode X pachayo.
  3. Manodhi ese ari murudyi subtree yeanopokana node X ane data kiyi yakakosha yakakura kupfuura kana yakaenzana nekukosha kwekiyi data yenode X pachayo.

Key - chero hunhu hweiyo node (semuenzaniso, nhamba). Kiyi inodiwa kuitira kuti iwe uwane iyo yemuti chinhu icho ichi kiyi inowirirana. Muenzaniso webinary search tree:

Binary Tree kana nzira yekugadzirira bhinari yekutsvaga muti

Tree view

Sezvatinofambira mberi, ini ndinopa zvimwe (zvichida zvisina kukwana) zvidimbu zvekodhi kuti uvandudze kunzwisisa kwako. Iyo yakazara kodhi ichave pakupera kwechinyorwa.

Muti une nodes. Node chimiro:

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;
    }
//...ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ ΡƒΠ·Π»Π°
}

Imwe neimwe node ine vana vaviri (zvinogoneka kuti Mwana wekuruboshwe uye/kana wekurudyiMwana ane huremu husina maturo). Iwe zvichida wakaziva kuti munyaya iyi nhamba yedata ndiyo data yakachengetwa mu node; kiyi - node kiyi.

Takagadzirisa pfundo, zvino ngatitaurei nezve kudzvanya matambudziko pamusoro pemiti. Pano, neshoko rokuti "muti" ndichareva pfungwa yebhinari yekutsvaga muti. Binary tree chimiro:

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

    //ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π΄Π΅Ρ€Π΅Π²Π°
}

Isu tinongoda mudzi wemuti semunda wekirasi, nekuti kubva pamudzi, uchishandisa iyo getLeftChild () uye getRightChild () nzira, unogona kusvika kune chero node mumuti.

Algorithms mumuti

Поиск

Ngatitii une muti wakavakwa. Nzira yekuwana sei chinhu chine kiyi kiyi? Iwe unofanirwa kufambisa sequentially kubva pamudzi pasi pemuti uye kuenzanisa kukosha kwekiyi nekiyi yenode inotevera: kana kiyi iri pasi pekiyi yenodhi inotevera, wobva waenda kuruboshwe wedzinza renodhi, kana iri. chikuru, kurudyi, kana makiyi akaenzana, node inodiwa inowanikwa! Kodhi yakakodzera:

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;
}

Kana ikozvino ikava isina maturo, saka kutsvaga kwasvika kumagumo emuti (pamwero wemafungiro, iwe uri panzvimbo isiripo mumuti - muzukuru weshizha).

Ngationei kubudirira kwekutsvaga kwegorgorithm pamuti wakaenzana (muti umo nodes inogoverwa zvakanyanya kana zvishoma zvakaenzana). Zvadaro kutsvaga kwekutsvaga kuchava O (log (n)), uye logarithm ndiyo nheyo 2. Tarisa: kana pane n zvinhu mumuti wakaenzana, zvino izvi zvinoreva kuti pachava nerogi (n) kugadzika 2 mazinga. muti. Uye mukutsvaga, mune imwe nhanho yekutenderera, iwe unodzika pasi imwe nhanho.

pinza

Kana iwe ukabata hunhu hwekutsvaga, saka kunzwisisa kuiswa hakuzove kwakaoma kwauri. Iwe unongoda kudzika kune shizha remuti (maererano nemitemo yekudzika inotsanangurwa mukutsvaga) uye uve muzukuru wayo - kuruboshwe kana kurudyi, zvichienderana nekiyi. Kuita:

   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;
                    }
                }
            }
        }
    }

Muchiitiko ichi, kuwedzera kune node yezvino, zvakakosha kuchengetedza ruzivo pamusoro pemubereki wenode yezvino. Kana zvazvino zvave zvakaenzana nekushata, shanduko yemubereki ichange iine pepa ratinoda.
Kugona kwekupinza kuchave kwakafanana nekwekutsvaga - O(log(n)).

Delete

Kubvisa ndiko kuvhiya kwakanyanya kunoda kuitwa pamuti. Zviripachena kuti chekutanga tichada kutsvaga chinhu chatichabvisa. Asi chii zvino? Kana isu tikangoisa chirevo chayo kune null, isu tinorasikirwa neruzivo nezve subtree iyo iyi node ndiyo mudzi. Nzira dzekubvisa miti dzakakamurwa kuita zviitiko zvitatu.

First case. Iyo node iri kudzimwa haina mwana

Kana iyo node iri kubviswa isina vana, zvinoreva kuti ishizha. Naizvozvo, iwe unogona kungoseta iyo kuruboshweMwana kana kurudyiChild minda yemubereki wake kuti iite.

Nyaya yechipiri. Iyo node yekudzimwa ine mwana mumwe

Nyaya iyi hainawo kunyanyooma. Ngatidzokere kumuenzaniso wedu. Ngatitii tinoda kudzima chinhu chine kiyi 14. Bvumiranai kuti sezvo iri chizvarwa chakakodzera chenodhi ine kiyi yechigumi, saka chero vedzinza racho (panyaya iyi kurudyi) achava nekiyi inodarika gumi, saka iwe. inogona "kucheka" nyore nyore kubva pamuti, uye kubatanidza mubereki zvakananga kumwana we node iri kubviswa, i.e. batanidza node nekiyi 10 kupfundo 10. Mamiriro acho ezvinhu aizova akafanana kudai zvakanga zvakakodzera kudzima nodi ari mwana asara womubereki wake. Funga nezvazvo iwe pachako - kuenzanisa chaiko.

Chechitatu nyaya. Node ine vana vaviri

Nyaya yakaoma zvikuru. Ngatitarisei muenzaniso mutsva.

Binary Tree kana nzira yekugadzirira bhinari yekutsvaga muti

Tsvaga achatsiva

Ngatitii tinoda kudzima node ine kiyi 25. Ndiani watinofanira kuisa panzvimbo yayo? Mumwe wevateveri vake (vazukuru kana vazukuru) anofanira kuva mutsivi(uyo achatora nzvimbo ye node iri kubviswa).

Nzira yekunzwisisa sei kuti ndiani anofanira kuva mutsivi? Intuitively, iyi node mumuti iyo kiyi ndiyo inotevera yakakura kubva painodzimwa. Iyo algorithm ndeyotevera. Iwe unofanirwa kuenda kuchizvarwa chayo chekurudyi (nguva dzose kune kurudyi, nekuti zvakatotaurwa kuti kiyi yekutsiva yakakura kupfuura kiyi yenodhi iri kudzimwa), wobva wapfuura nemuketani yevazukuru vekuruboshwe vedzinza rerudyi iri. . Mumuenzaniso, taizoenda kune node ine kiyi 35, tozodzika kushizha kuburikidza neketani yevana vayo kuruboshwe - munyaya iyi, ketani iyi inongosanganisira node ine kiyi 30. Kunyatsotaura, tiri kutarisa. kune diki node museti yemanodhi akakura kupfuura yatiri kutsvaga node.

Binary Tree kana nzira yekugadzirira bhinari yekutsvaga muti

Successor search method code:

    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;
    }

Kodhi yakazara yenzira yekudzima:

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;
    }

Iyo yakaoma inogona kuenzaniswa neO (log(n)).

Kutsvaga huwandu / hushoma mumuti

Zviripachena kuti ungawana sei hushoma/hwakanyanya kukosha mumuti - iwe unofanirwa kuteedzana kufamba uchitevedza ketani yekuruboshwe / kurudyi zvinhu zvemuti, zvichiteerana; kana iwe wasvika kune pepa, ichave iri shoma / yakanyanya chinhu.

    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;
    }

Kuomarara - O(log(n))

Symmetrical bypass

Traversal iri kushanyira node yega yega yemuti kuti iite chimwe chiito nawo.

Recursive symmetric traversal algorithm:

  1. Ita chiito pamwana wekuruboshwe
  2. Ita chiito iwe pachako
  3. Ita chiito pamwana chaiye

Code:

    public void inOrder(Node<T> current) {
        if (current != null) {
            inOrder(current.getLeftChild());
            System.out.println(current.getData() + " ");//Π—Π΄Π΅ΡΡŒ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ всС, Ρ‡Ρ‚ΠΎ ΡƒΠ³ΠΎΠ΄Π½ΠΎ
            inOrder(current.getRightChild());
        }
    }

mhedziso

Pakupedzisira! Kana ndisina kutsanangura chero chinhu kana kuti ndine chero mhinduro, ndapota vasiye mumashoko. Sezvakavimbiswa, ndinopa kodhi yakazara.

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

Kuderera kuO(n)

Vazhinji venyu vangave vakacherechedza: ko kana iwe ukaita kuti muti urege kuenzana? Semuenzaniso, isa nodes nekuwedzera makiyi mumuti: 1,2,3,4,5,6... Ipapo muti wacho unenge wakafanana nechinyorwa chakabatanidzwa. Uye hongu, muti ucharasikirwa nechimiro chemuti, uye naizvozvo kubudirira kwekuwana data. Iko kuomarara kwekutsvaga, kuisa, uye kudzima mabasa anozofanana neaya erondedzero yakabatana: O(n). Ichi ndicho chimwe chezvinonyanya kukosha, mumaonero angu, zvisingabatsiri zvemiti yemabhinari.

Vashandisi vakanyoresa chete ndivo vanogona kutora chikamu muongororo. Nyorera mu, Munogamuchirwa.

Ini ndanga ndisati ndave pahubhu kwenguva yakareba, uye ndinoda kuziva kuti ndezvipi zvinyorwa pane misoro ipi yaungade kuona yakawanda?

  • Data zvimiro

  • Algorithms (DP, recursion, kudzvanya data, nezvimwewo)

  • Kushandiswa kwe data zvimiro uye algorithms muhupenyu chaihwo

  • Kugadzira Android Zvishandiso muJava

  • Kugadzira webhu maapplication muJava

2 vashandisi vakavhota. 1 mushandisi haana.

Kunobva: www.habr.com

Voeg