Binary Tree po'o le auala e saunia ai se la'au su'esu'e binary

Fuafuaga

O lenei tusiga e uiga i laʻau suʻesuʻe binary. Na ou faia talu ai nei se tala e uiga i fa'apipi'i fa'amatalaga e fa'aaoga ai le auala Huffman. O iina ou te leʻi gauai tele atu i laʻau binary, ona o le suʻesuʻeina, faʻaofiina, ma le tapeina o auala e le talafeagai. O lea la ua ou filifili e tusi se tala e uiga i laau. Tatou amata.

O le la'au o se fausaga fa'amaumauga e iai nodes e feso'ota'i i pito. E mafai ona tatou fai atu o se laau o se tulaga faapitoa o se kalafi. O se fa'ata'ita'iga la'au lea:

Binary Tree po'o le auala e saunia ai se la'au su'esu'e binary

E le o se la'au su'esu'e binary! Ua tipi mea uma!

Faʻamatalaga

Aʻa

A'a laau - o lona pito pito i luga lea. I le faʻataʻitaʻiga, o le pona A lea. O le mea moni, so'o se node e mafai ona manatu o le a'a o le la'au la'au e fetaui ma lenei node.

Matua/tupuga

O pona uma se'i vagana le a'a e tasi le pito e tau atu i le isi pona. O le node o loʻo i luga aʻe o le taimi nei e taʻua matua lenei node. O se node o loʻo i lalo ifo o le taimi nei ma fesoʻotaʻi i ai e taʻua suli lenei node. Sei o tatou faaaogaina se faataitaiga. Se'i ave le node B, ona avea lea o lona matua ma node A, ae o lana fanau o le node D, E ma le F.

Lefi

O se pona e leai ni fanau o le a ta'ua o le lau o le laau. I le faʻataʻitaʻiga, o lau o le a avea ma nodes D, E, F, G, I, J, K.

O upu faavae lea. O isi manatu o le a talanoaina atili. O lea la, o le la'au binary o se la'au lea e le sili atu ma le to'alua tamaiti ta'i pona ta'itasi. E pei ona e mateina, o le laʻau mai le faʻataʻitaʻiga e le o se binary, aua o pona B ma H e sili atu ma le lua tamaiti. O se faʻataʻitaʻiga lea o se laʻau binary:

Binary Tree po'o le auala e saunia ai se la'au su'esu'e binary

O nodes laau e mafai ona iai so'o se fa'amatalaga. O le la'au su'esu'e la'au o se la'au la'au la'au e iai mea nei:

  1. O la'au la'au agavale ma taumatau o la'au su'esu'e fa'alua.
  2. O pona uma o le la'au agavale o le node X o lo'o i ai fa'amaumauga autu e itiiti ifo nai lo le tau o le ki fa'amatalaga o le node X lava ia.
  3. O nodes uma i le la'au sa'o o le node X o lo'o i ai fa'amaumauga autu e sili atu pe tutusa ma le tau o le ki fa'amatalaga o le node X lava ia.

Ki — so'o se uiga o le node (mo se fa'ata'ita'iga, se numera). E mana'omia le ki ina ia mafai ona e mauaina le elemene laau e fetaui ma lenei ki. Faataitaiga o se laau su'esu'e binary:

Binary Tree po'o le auala e saunia ai se la'au su'esu'e binary

Va'aiga laau

A o tatou agai i luma, o le a ou saunia ni fasi tulafono (atonu e le atoatoa) e faaleleia atili ai lou malamalama. Ole fa'ailoga atoa ole a iai ile pito ole tala.

O se laau e iai ni nodes. Fuafuaga node:

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;
    }
//...остальные методы узла
}

O pona ta'itasi e to'alua tamaiti (e mafai lava e le leftChild ma/po'o le rightChild tamaiti o le ai ai se tau aoga). Atonu na e iloaina i lenei tulaga o le numera numera o faʻamaumauga o loʻo teuina i totonu o le node; ki — ki node.

Ua matou fa'avasegaina le nonoa, o lea se'i o tatou talanoa i fa'afitauli faigata e uiga i la'au. Mulimuli ane, o le upu "laau" o le a ou faauigaina le manatu o se laau suʻesuʻe binary. Fa'atulagaina o la'au fa'alua:

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

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

Matou te manaʻomia naʻo le aʻa o le laau e fai ma vasega vasega, aua mai le aʻa, faʻaaoga le getLeftChild() ma getRightChild() metotia, e mafai ona e alu i soʻo se node i totonu o le laau.

Algorithms i se laau

Поиск

Se'i faapea ua i ai sau la'au ua fau. E fa'afefea ona maua se elemene ma le ki ki? E te manaʻomia le faʻasolosolo faʻasolosolo mai le aʻa i lalo o le laau ma faʻatusatusa le taua o le ki ma le ki o le isi node: afai e laʻititi le ki nai lo le ki o le isi node, ona e alu lea i le itu tauagavale o le node, pe a fai sili atu, i le itu taumatau, afai e tutusa ki, e maua le pona mana'omia! Fa'ailoga talafeagai:

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

Afai e le aoga le taimi nei, ona oʻo lea o le sailiga i le pito o le laau (i se tulaga faʻavae, o oe o loʻo i ai i se nofoaga e le o iai i totonu o le laau - o se tupuga o se lau).

Sei o tatou mafaufau i le aoga o le suʻesuʻega algorithm i luga o se laʻau paleni (o se laʻau o loʻo faʻasoa faʻatasi ai pe itiiti ifo). Ona avea lea o le lelei o le sailiga o le O(log(n)), ma o le logarithm o le faavae 2. Va'ai: afai e iai ni elemene i totonu o se laau paleni, o lona uiga o le ai ai ogalaau(n) e faavae 2 tulaga o le laau. Ma i le sailiga, i le tasi laasaga o le taamilosaga, e te alu i lalo i le tasi tulaga.

fafao

Afai e te malamalama i le uiga o le suʻesuʻega, o le malamalama i le faʻaofiina o le a le faigata ia te oe. E tatau lava ona e alu ifo i lalo i se laulaau o le laau (e tusa ai ma tulafono o le tupuaga o loʻo faʻamatalaina i le sailiga) ma avea ma ana suli - agavale poʻo le taumatau, faʻalagolago i le ki. Fa'atinoga:

   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 lenei tulaga, e faaopoopo atu i le node o loʻo i ai nei, e tatau ona teuina faʻamatalaga e uiga i le matua o le node o loʻo iai nei. A tutusa le taimi nei ma le null, o le fesuiaiga matua o le a aofia ai le laupepa tatou te manaʻomia.
O le lelei o le faʻaofiina o le a mautinoa lava e tutusa ma le suʻega - O(log(n)).

Aveese

O le aveeseina o le taotoga sili ona faigata lea e manaʻomia ona faia i luga o se laau. E manino lava muamua e manaʻomia ona tatou suʻeina le elemene o le a tatou tapeina. Ae faapefea la? Afai tatou te setiina lona faasinomaga i le null, o le a tatou leiloa faʻamatalaga e uiga i le subtree lea o lenei node o le aʻa. O auala e aveese ai laau e vaevaeina i ni mataupu se tolu.

Muamua mataupu. O le node o loʻo tapeina e leai se fanau

Afai o le node o loʻo tapeina e leai se fanau, o lona uiga o se lau. O le mea lea, e mafai ona e setiina le leftChild poʻo le rightChild fanua o lona matua i le null.

Mataupu lona lua. O le node e tape e tasi le tamaititi

O lenei foi mataupu e le faigata tele. Sei o tatou toe foi i la tatou faataitaiga. Seʻi tatou fai atu e tatau ona tatou tapeina se elemene ma ki 14. Ioe talu ai o le saʻo e tupuga mai i se node ma le ki 10, o soʻo se tasi o ona suli (i le tulaga lea o le saʻo) o le ai ai se ki e sili atu nai lo le 10, o lea e te e mafai ona faigofie ona "tipi" mai le laau, ma faʻafesoʻotaʻi saʻo le matua i le tamaititi o le node o loʻo tapeina, i.e. fa'afeso'ota'i le node ma le ki 10 i le node 13. E fa'apena le tulaga pe a mana'omia le tapeina o se node o le tamaititi agavale a lona matua. Mafaufau i ai - o se faʻatusa tonu.

Tulaga lona tolu. O se node e to'alua lana fanau

Le mataupu sili ona faigata. Sei o tatou vaavaai i se faataitaiga fou.

Binary Tree po'o le auala e saunia ai se la'au su'esu'e binary

Saili mo se sui

Se'i faapea e tatau ona tatou tapeina se node ma le ki 25. O ai e tatau ona tatou tuu i ai? E tatau ona avea se tasi o ona soo (suli po o suli o suli). sui(o le tasi o le a suitulaga i le node ua aveese).

E faapefea ona malamalama po o ai e tatau ona avea ma sui? Ile fa'amanino, o le node lea i totonu o le la'au o lona ki e pito sili ona tele mai le node o lo'o tapeina. Ole algorithm e fa'apea. E tatau ona e alu i lona tupuaga taumatau (i taimi uma i le itu taumatau, aua ua uma ona fai mai o le ki e suitulaga e sili atu nai lo le ki o le node o loʻo tapeina), ona ui atu lea i le filifili o suli agavale o lenei suli taumatau. . I le faʻataʻitaʻiga, matou te o atu i le node ma le ki 35, ona alu ifo lea i lalo i le lau e ala i le filifili o lana fanau agavale - i lenei tulaga, o lenei filifili e naʻo le node ma le ki 30. O le mea moni, o loʻo matou vaʻavaʻai. mo le node aupito itiiti i le seti o pona e sili atu nai lo le tasi o loo tatou sailia mo node.

Binary Tree po'o le auala e saunia ai se la'au su'esu'e binary

Fa'ailoga ole metotia su'esu'e:

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

Fa'ailoga atoa mo le auala tapeina:

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

Ole lavelave e mafai ona fa'atatau ile O(log(n)).

Su'eina le maualuga/maualalo i totonu o se laau

E manino le auala e maua ai le tau maualalo/maualuga i totonu o se laʻau - e tatau ona e faʻasolosolo faʻasolosolo i luga o le filifili o elemene agavale/taumatau o le laʻau, i le faasologa; a e oʻo i le laupepa, o le a avea ma elemene aupito maualalo / maualuga.

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

Lavelave - O(log(n))

Fa'asaga tutusa

Traversal o lo'o asiasi i pona ta'itasi o le la'au ina ia fai se gaioiga i ai.

Algoritimi fa'ata'ita'i fa'atusa fa'asolosolo:

  1. Fai se taga ile tamaititi agavale
  2. Fai se gaioiga ma oe lava ia
  3. Fai se taga i le tamaititi sa'o

Code:

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

iʻuga

Mulimuli ane! Afai ou te leʻi faʻamatalaina se mea pe iai ni faʻamatalaga, faʻamolemole tuʻu i latou i faʻamatalaga. E pei ona folafola mai, ou te tuuina atu le code atoa.

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

SALA

Pa'u i le O(n)

Atonu ua matauina e le toatele o outou: e faapefea pe a e faia le laau e le paleni? Mo se faʻataʻitaʻiga, tuʻu nodes ma faʻateleina ki i totonu o se laʻau: 1,2,3,4,5,6... Ona foliga lea o le laau o se lisi fesoʻotaʻi. Ma ioe, o le laau o le a leiloa lona fausaga laau, ma o le mea lea o le lelei o le mauaina o faʻamatalaga. Ole lavelave ole su'esu'ega, fa'aofiina, ma le tapeina o galuega o le a tutusa ma le lisi o feso'ota'iga: O(n). O se tasi lea o mea sili ona taua, i loʻu manatu, le lelei o laʻau binary.

Na'o tagata fa'aigoaina e mafai ona auai i le su'esu'ega. Saini ese j, faʻamolemole.

Ou te leʻi i ai i luga o le nofoaga mo se taimi umi, ma ou te fia iloa po o a tala i luga o a autu e te fia vaʻai atili i ai?

  • Fa'asologa o Fa'amaumauga

  • Algorithms (DP, toe fa'afo'i, fa'apipi'i fa'amaumauga, ma isi)

  • Faʻaaogaina o faʻamaumauga faʻamaumauga ma algorithms i le olaga moni

  • Polokalama Talosaga Android i Java

  • Polokalama 'upega tafaʻilagi talosaga i Java

2 tagata fa'aoga na palota. 1 tagata fa'aoga fa'ate'aina.

Punavai: www.habr.com

Faaopoopo i ai se faamatalaga