Binārie koki JavaScript: pilnīgs ceļvedis

Pēdējā atjaunošana: 30 2025 septembris
binārie koki javascript

Vai esat kādreiz domājis, kā efektīvi organizēt un uzglabāt datus JavaScript? Binārie koki ir pamata datu struktūra, kas ļauj to izdarīt. Šajā rakstā jūs ienirt aizraujošajā JavaScript bināro koku pasaulē. Jūs uzzināsit, kas tie ir, kā tos ieviest, kā veikt pamata un papildu darbības, kā arī atklāsiet dažus paraugpraksi darbam ar tiem. Gatavojieties paplašināt savas zināšanas un pacelt savas programmēšanas prasmes nākamajā līmenī!

Binārie koki JavaScript

Binārie koki ir hierarhiska datu struktūra, kurā katram mezglam var būt ne vairāk kā divi bērni: kreisais bērns un labais bērns. Katru mezglu attēlo objekts, kas satur vērtību un atsauces uz tā bērniem. Šī struktūra ir ārkārtīgi daudzpusīga un tiek izmantota daudzās datorzinātņu jomās, piemēram, datu manipulācijā, meklēšanas algoritmos un optimizācijā.

Kāpēc mācīties par binārajiem kokiem JavaScript?

Zināšanas par binārajiem kokiem JavaScript ir ļoti svarīgas ikvienam programmētājam, kurš vēlas izprast un efektīvi atrisināt sarežģītas problēmas. Binārie koki tiek plaši izmantoti meklēšanas algoritmos, uzlabotās datu struktūrās un optimizācijas algoritmos. Zinot, kā ar tiem strādāt, varēsit rakstīt efektīvāku, mērogojamāku un augstas veiktspējas kodu. Turklāt daudzi darba devēji novērtē izstrādātājus, kuriem ir pieredze darbā ar binārajiem kokiem, kas var jums pavērt jaunas karjeras iespējas.

Binārā koka ieviešana JavaScript

Pirms iedziļināties darbībās un paraugpraksēs, ir svarīgi saprast, kā JavaScript ieviest bināro koku. Ir vairāki veidi, kā to izdarīt, bet viens no visizplatītākajiem ir izmantot klases un atsauces uz bērniem. Šeit ir pamata piemērs tam, kā izskatītos binārā koka ieviešana JavaScript programmā:

class Nodo {
  constructor(valor) {
    this.valor = valor;
    this.izquierdo = null;
    this.derecho = null;
  }
}

class ArbolBinario {
  constructor() {
    this.raiz = null;
  }
  
  // Métodos del árbol binario
}

Šajā piemērā mēs izveidojam klasi Nodo kas apzīmē katru koka mezglu un klasi ArbolBinario kas ir atbildīgs par koka struktūras un darbību pārvaldību. Katram mezglam ir vērtība un atsauces uz tā kreiso un labo atvasi, kas inicializēta kā null noklusējuma. Koka sakni attēlo atribūts raiz klases ArbolBinario.

Pamatoperācijas ar binārajiem kokiem

Kad esat ieviesis bināro koku JavaScript, varat ar to veikt dažādas pamata darbības. Šīs darbības ļauj pievienot, noņemt un meklēt vienumus kokā. Apskatīsim dažas no visizplatītākajām darbībām:

Elementa ievietošana binārajā kokā

Elementa ievietošana binārajā kokā ietver jaunā mezgla pareizās pozīcijas atrašanu un tā atbilstošu sasaisti ar esošajiem mezgliem. Šeit ir piemērs tam, kā var īstenot elementa ievietošanu binārajā kokā:

class ArbolBinario {
  // ...

  insertar(valor) {
    const nuevoNodo = new Nodo(valor);

    if (this.raiz === null) {
      this.raiz = nuevoNodo;
    } else {
      this.insertarNodo(this.raiz, nuevoNodo);
    }
  }

  insertarNodo(nodo, nuevoNodo) {
    if (nuevoNodo.valor < nodo.valor) {
      if (nodo.izquierdo === null) {
        nodo.izquierdo = nuevoNodo;
      } else {
        this.insertarNodo(nodo.izquierdo, nuevoNodo);
      }
    } else {
      if (nodo.derecho === null) {
        nodo.derecho = nuevoNodo;
      } else {
        this.insertarNodo(nodo.derecho, nuevoNodo);
      }
    }
  }
}

Šajā piemērā funkcija insertar(valor) izveido jaunu mezglu ar norādīto vērtību un pārbauda, ​​vai koka sakne ir null. Ja tā, iestatiet jauno mezglu kā root. Pretējā gadījumā izsauciet funkciju insertarNodo(nodo, nuevoNodo) lai atrastu pareizo pozīciju jaunajam mezglam.

Elementa meklēšana binārajā kokā

Elementa meklēšana binārajā kokā ietver sakārtotu koka šķērsošanu, lai atrastu mezglu, kurā ir vēlamā vērtība. Šeit ir piemērs tam, kā var īstenot elementa meklēšanu binārā kokā:

class ArbolBinario {
  // ...

  buscar(valor) {
    return this.buscarNodo(this.raiz, valor);
  }

  buscarNodo(nodo, valor) {
    if (nodo === null || nodo.valor === valor) {
      return nodo;
    } else if (valor < nodo.valor) {
      return this.buscarNodo(nodo.izquierdo, valor);
    } else {
      return this.buscarNodo(nodo.derecho, valor);
    }
  }
}

Šajā piemērā funkcija buscar(valor) izsauc funkciju buscarNodo(nodo, valor) nododot koka sakni un vērtību, kuru vēlaties meklēt. Funkcija buscarNodo(nodo, valor) veic rekursīvu meklēšanu kokā, pārbaudot, vai pašreizējais mezgls ir null vai ja tā vērtība atbilst meklētajai vērtībai. Atkarībā no salīdzinājuma, tiek turpināta kreisā vai labā bērna meklēšana.

  MergeSort algoritms C un Java

Elementa dzēšana binārā kokā

Elementa noņemšana no binārā koka var būt nedaudz sarežģītāka, jo ir jāņem vērā dažādi gadījumi atkarībā no koka struktūras. Šeit ir piemērs tam, kā var īstenot elementa noņemšanu no binārā koka:

class ArbolBinario {
  // ...

  eliminar(valor) {
    this.raiz = this.eliminarNodo(this.raiz, valor);
  }

  eliminarNodo(nodo, valor) {
    if (nodo === null) {
      return null;
    } else if (valor < nodo.valor) {
      nodo.izquierdo = this.eliminarNodo(nodo.izquierdo, valor);
      return nodo;
    } else if (valor > nodo.valor) {
      nodo.derecho = this.eliminarNodo(nodo.derecho, valor);
      return nodo;
    } else {
      if (nodo.izquierdo === null && nodo.derecho === null) {
        return null;
      } else if (nodo.izquierdo === null) {
        return nodo.derecho;
      } else if (nodo.derecho === null) {
        return nodo.izquierdo;
      } else {
        const sucesor = this.encontrarSucesor(nodo.derecho);
        nodo.valor = sucesor.valor;
        nodo.derecho = this.eliminarNodo(nodo.derecho, sucesor.valor);
        return nodo;
      }
    }
  }

  encontrarSucesor(nodo) {
    let sucesor = nodo;
    while (sucesor.izquierdo !== null) {
      sucesor = sucesor.izquierdo;
    }
    return sucesor;
  }
}

Šajā piemērā funkcija eliminar(valor) izsauc funkciju eliminarNodo(nodo, valor) nododot koka sakni un dzēšamo vērtību. Funkcija eliminarNodo(nodo, valor) veic rekursīvu dzēšanu, ņemot vērā dažādus gadījumus atkarībā no koka struktūras. Ja pašreizējais mezgls ir null, tiek atgriezts null. Ja meklētā vērtība ir mazāka par pašreizējā mezgla vērtību, dzēšana tiek veikta kreisajam bērnam. Ja tas ir vecāks, tas tiek veikts pareizajam dēlam. Ja mezglam ir abi bērni, tiek atrasts tuvākais pēctecis un tiek veikta vērtību mijmaiņa, pirms tiek noņemts pēctecis.

Papildu darbības ar binārajiem kokiem

Papildus pamatoperācijām binārie koki atbalsta vairākas uzlabotas darbības, kas var palīdzēt veikt sarežģītākus uzdevumus. Šīs darbības ļauj šķērsot koku dažādās secībās, aprēķināt tā augstumu, pārbaudīt, vai tas ir līdzsvarots un daudz ko citu. Tālāk mēs izpētīsim dažas no šīm darbībām.

Binārā koka šķērsošana kārtībā

Binārā koka nepareiza šķērsošana ietver mezglu apmeklēšanu šādā secībā: vispirms kreisais bērns, tad pašreizējais mezgls un visbeidzot labais bērns. Šis pārvietošanās veids ir noderīgs, lai iegūtu koka elementus augošā secībā. Šeit ir piemērs, kā ieviest binārā koka šķērsošanu secībā:

class ArbolBinario {
  // ...

  recorridoEnOrden() {
    this.recorrerEnOrden(this.raiz);
  }

  recorrerEnOrden(nodo) {
    if (nodo !== null) {
      this.recorrerEnOrden(nodo.izquierdo);
      console.log(nodo.valor);
      this.recorrerEnOrden(nodo.derecho);
    }
  }
}

Šajā piemērā funkcija recorridoEnOrden() izsauc funkciju recorrerEnOrden(nodo) ejot garām koka saknei. Funkcija recorrerEnOrden(nodo) veic rekursīvu pārvietošanos secībā, izdrukājot pašreizējā mezgla vērtību starp izsaukumiem uz kreiso un labo bērnu.

Binārā koka šķērsošanas priekšpasūtīšana

Binārā koka iepriekšēja pasūtīšana ietver mezglu apmeklēšanu šādā secībā: vispirms pašreizējais mezgls, pēc tam kreisais bērns un visbeidzot labais bērns. Šāda veida ekskursija ir noderīga, lai izveidotu koka kopiju vai izdrukātu tā vizuālo attēlojumu. Šeit ir piemērs, kā ieviest binārā koka priekšpasūtīšanas šķērsošanu:

class ArbolBinario {
  // ...

  recorridoPreOrden() {
    this.recorrerPreOrden(this.raiz);
  }

  recorrerPreOrden(nodo) {
    if (nodo !== null) {
      console.log(nodo.valor);
      this.recorrerPreOrden(nodo.izquierdo);
      this.recorrerPreOrden(nodo.derecho);
    }
  }
}

Šajā piemērā funkcija recorridoPreOrden() izsauc funkciju recorrerPreOrden(nodo) ejot garām koka saknei. Funkcija recorrerPreOrden(nodo) veic rekursīvu pārvietošanos priekšpasūtīšanā, izdrukājot pašreizējā mezgla vērtību pirms kreisās un labās atvases izsaukšanas.

  Algoritmu veidi datorzinātnēs

Binārā koka šķērsošana pēc kārtas

Binārā koka šķērsošana pēc kārtas ietver mezglu apmeklēšanu šādā secībā: vispirms kreisais bērns, tad labais bērns un visbeidzot pašreizējais mezgls. Šis pārvietošanās veids ir noderīgs, lai atbrīvotu koka aizņemto atmiņu vai veiktu darbības, kas ir atkarīgas no bērniem pirms pašreizējā mezgla apstrādes. Šeit ir piemērs tam, kā ieviest binārā koka pārvietošanu pēc kārtas:

class ArbolBinario {
  // ...

  recorridoPostOrden() {
    this.recorrerPostOrden(this.raiz);
  }

  recorrerPostOrden(nodo) {
    if (nodo !== null) {
      this.recorrerPostOrden(nodo.izquierdo);
      this.recorrerPostOrden(nodo.derecho);
      console.log(nodo.valor);
    }
  }
}

Šajā piemērā funkcija recorridoPostOrden() izsauc funkciju recorrerPostOrden(nodo) ejot garām koka saknei. Funkcija recorrerPostOrden(nodo) veic postorder rekursīvo pārvietošanos, vispirms izsaucot kreiso un labo bērnu un pēc tam izdrukājot pašreizējā mezgla vērtību.

Paraugprakse darbam ar binārajiem kokiem JavaScript

Tagad, kad jums ir laba izpratne par pamata un papildu darbībām ar binārajiem kokiem JavaScript, ir svarīgi paturēt prātā dažas paraugprakses darbam ar tiem. Šīs prakses palīdzēs jums uzrakstīt lasāmāku, efektīvāku un uzturējamāku kodu:

  1. Pareizi dokumentējiet savu kodu: Binārie koki var ātri kļūt sarežģīti, tāpēc ir ļoti svarīgi skaidri un kodolīgi dokumentēt savu kodu. Izskaidrojiet katras metodes mērķi, tās parametrus un paredzamo atdeves vērtību. Tas padarīs kodu vieglāk saprotamu jums un citiem izstrādātājiem, kuri nākotnē varētu strādāt pie projekta.
  2. Izmantojiet aprakstošus nosaukumus mainīgajiem un metodēm: izvēlieties nosaukumus, kas atspoguļo katra mainīgā un metodes mērķi un funkciju jūsu binārā koka ieviešanā. Tas padarīs jūsu kodu lasāmāku un saprotamāku, atvieglojot tā apkopi un atkļūdošanu.
  3. Veiciet plašu pārbaudi: Pirms binārā koka ieviešanas izmantošanas reālā projektā noteikti veiciet rūpīgu pārbaudi, lai pārliecinātos, ka tā darbojas pareizi. Izveidojiet testa gadījumus, kas aptver dažādus scenārijus, un pārbaudiet, vai rezultāti atbilst gaidītajam. Tas palīdzēs jums identificēt iespējamās kļūdas un nodrošināt ieviešanas uzticamību.
  4. Apsveriet efektivitāti: Binārie koki var piedāvāt lielu datu apstrādes un meklēšanas efektivitāti, taču ir svarīgi ņemt vērā ieviešanas efektivitāti. Novērtējiet savu algoritmu veiktspēju un meklējiet iespējas tos optimizēt, ja nepieciešams. Piemēram, varat izmantot koku balansēšanas paņēmienus, lai nodrošinātu, ka koku augstums paliek pieņemamā līmenī.
  5. Izmantojiet esošās bibliotēkas un resursus: JavaScript ir pieejams plašs bibliotēku un resursu klāsts, kas var palīdzēt efektīvāk strādāt ar binārajiem kokiem. Izpētiet un izmantojiet bibliotēkas, piemēram, binarytree vai bintrees, lai izmantotu jau pārbaudītās un optimizētās ieviešanas priekšrocības. Turklāt skatiet oficiālo JavaScript dokumentāciju un uzticamus tiešsaistes resursus, lai paplašinātu savas zināšanas un atrisinātu iespējamās problēmas.
  6. Komentējiet savu kodu: papildus ārējai dokumentācijai ir svarīgi kodā pievienot atbilstošus komentārus. Izskaidro noteiktu koda sadaļu vai rindu mērķi, kā arī izmantotos algoritmus vai pieejas. Tas palīdzēs citiem izstrādātājiem (un nākotnē jums) ātri saprast, kā darbojas jūsu ieviešana.
  Meklēšanas algoritmi: kas tie ir un kā tie darbojas

Bieži uzdotie jautājumi

Šeit ir daži bieži uzdotie jautājumi par binārajiem kokiem JavaScript:

  1. Kāda ir atšķirība starp bināro koku un bināro meklēšanas koku? Binārais koks ir hierarhiska datu struktūra, kurā katram mezglam var būt līdz diviem bērniem. Binārais meklēšanas koks ir noteikta veida binārais koks, kurā mezglu vērtības ir sakārtotas tā, lai mazākās vērtības būtu kreisajā bērnā un lielākās vērtības būtu labajā bērnā. Tas ļauj veikt efektīvu meklēšanu kokā.
  2. Kad citu datu struktūru vietā vajadzētu izmantot bināro koku? Binārais koks ir jāizmanto, ja nepieciešama efektīva datu struktūra, lai hierarhiski sakārtotu un uzglabātu datus. Binārie koki ir īpaši noderīgi, ja nepieciešams efektīvi veikt meklēšanas, ievietošanas un dzēšanas darbības.
  3. Vai ir iespējams līdzsvarot bināro koku pēc vairāku ievietošanas un dzēšanas darbību veikšanas? Jā, ir iespējams līdzsvarot bināro koku pēc vairāku ievietošanas un dzēšanas darbību veikšanas. Ir dažādi balansēšanas algoritmi, piemēram, AVL koks vai sarkani melns koks, kas nodrošina koka augstuma saglabāšanu optimālā līmenī un novērš koka nelīdzsvarotību.
  4. Vai binārie koki tiek izmantoti tikai skaitlisku datu glabāšanai? Nē, bināros kokus var izmantot, lai saglabātu jebkura veida datus, ne tikai ciparu datus. Varat ieviest bināros kokus, kas glabā teksta virknes, pielāgotus objektus vai cita veida datus atkarībā no jūsu vajadzībām.
  5. Vai ir kāda JavaScript bibliotēka darbam ar binārajiem kokiem? Jā, ir vairākas JavaScript bibliotēkas, kas piedāvā uzlabotas funkcionalitātes darbam ar binārajiem kokiem. Dažas no populārajām bibliotēkām ietver “binarytree”, “bintrees” un “d3-binarytree”. Šīs bibliotēkas nodrošina lietošanai gatavu ieviešanu un papildu funkcijas darbam ar binārajiem kokiem.
  6. Kādi ir bināro koku praktiskie pielietojumi reālajā pasaulē? Binārie koki tiek izmantoti dažādās reālās pasaules lietojumprogrammās, piemēram, datubāzēs, meklēšanas algoritmos, saspiešanas algoritmos, failu sistēmas un vēl daudz vairāk. Tie ir būtiski, lai efektīvi organizētu un meklētu datus daudzās sistēmās un lietojumprogrammās.

Secinājums

Binārie koki JavaScript ir spēcīgs rīks efektīvai datu organizēšanai un apstrādei. Šajā rakstā jūs uzzinājāt bināro koku pamatus, to ieviešanu JavaScript, kā arī pamata un papildu darbības, ko ar tiem varat veikt. Turklāt mēs esam izpētījuši dažas paraugprakses un atbildējuši uz bieži uzdotajiem jautājumiem, lai palīdzētu jums paplašināt savas zināšanas.

Tagad, kad jums ir laba izpratne par JavaScript binārajiem kokiem, ir pienācis laiks izmantot šīs zināšanas savos projektos un turpināt izpētīt iespējas, ko piedāvā šī datu struktūra. Paplašiniet savas programmēšanas prasmes un paceliet savu kodu uz nākamo līmeni, izmantojot JavaScript bināros kokus!