Fuafuaga
O lenei tusiga e uiga i laʻau suʻesuʻe binary. Na ou faia talu ai nei se tala e uiga i
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:
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:
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:
- O la'au la'au agavale ma taumatau o la'au su'esu'e fa'alua.
- 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.
- 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:
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.
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.
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:
- Fai se taga ile tamaititi agavale
- Fai se gaioiga ma oe lava ia
- 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.
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