Prelude
Ichi chinyorwa chiri pamusoro pemiti yekutsvaga yebhinari. Ini nguva pfupi yadarika ndakaita chinyorwa nezve
Muti chimiro che data chinosanganisira nodes dzakabatana nemicheto. Tinogona kutaura kuti muti inyaya yakakosha yegirafu. Heino muenzaniso 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:
Miti yemiti inogona kunge ine chero ruzivo. Muti webhinari yekutsvaga muti webhinari une zvinotevera:
- Ose ari maviri kuruboshwe uye kurudyi subtrees ibhinari yekutsvaga miti.
- Manode ese eruboshwe subtree yeanopokana node X ane data kiyi yakakosha yakaderera pane kukosha kwekiyi data yenode X pachayo.
- 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:
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.
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.
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:
- Ita chiito pamwana wekuruboshwe
- Ita chiito iwe pachako
- 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.
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