Έχετε αναρωτηθεί ποτέ πώς να οργανώνετε και να αποθηκεύετε αποτελεσματικά δεδομένα σε JavaScript; Τα δυαδικά δέντρα είναι μια θεμελιώδης δομή δεδομένων που σας επιτρέπει να κάνετε ακριβώς αυτό. Σε αυτό το άρθρο, θα βουτήξετε στον συναρπαστικό κόσμο των δυαδικών δέντρων στο JavaScript. Θα μάθετε τι είναι, πώς να τις εφαρμόσετε, πώς να εκτελείτε βασικές και προηγμένες λειτουργίες και θα ανακαλύψετε μερικές βέλτιστες πρακτικές για να δουλέψετε μαζί τους. Ετοιμαστείτε να διευρύνετε τις γνώσεις σας και να ανεβάσετε τις προγραμματιστικές σας δεξιότητες στο επόμενο επίπεδο!
Δυαδικά δέντρα σε JavaScript
Τα δυαδικά δέντρα είναι μια ιεραρχική δομή δεδομένων στην οποία κάθε κόμβος μπορεί να έχει το πολύ δύο παιδιά: ένα αριστερό παιδί και ένα δεξί παιδί. Κάθε κόμβος αντιπροσωπεύεται από ένα αντικείμενο που περιέχει μια τιμή και αναφορές στα παιδιά του. Αυτή η δομή είναι εξαιρετικά ευέλικτη και χρησιμοποιείται σε πολλούς τομείς της επιστήμης των υπολογιστών, όπως η χειραγώγηση δεδομένων, οι αλγόριθμοι αναζήτησης και η βελτιστοποίηση.
Γιατί να μάθετε για τα δυαδικά δέντρα στο JavaScript;
Η γνώση των δυαδικών δέντρων σε JavaScript είναι ζωτικής σημασίας για κάθε προγραμματιστή που θέλει να κατανοήσει και να λύσει σύνθετα προβλήματα αποτελεσματικά. Τα δυαδικά δέντρα χρησιμοποιούνται ευρέως σε αλγόριθμους αναζήτησης, προηγμένες δομές δεδομένων και αλγόριθμους βελτιστοποίησης. Γνωρίζοντας πώς να εργάζεστε μαζί τους θα σας επιτρέψει να γράψετε πιο αποτελεσματικό, επεκτάσιμο και υψηλότερο κώδικα. Επιπλέον, πολλοί εργοδότες εκτιμούν τους προγραμματιστές που έχουν εμπειρία στο χειρισμό δυαδικών δέντρων, κάτι που μπορεί να ανοίξει νέες ευκαιρίες καριέρας για εσάς.
Υλοποίηση δυαδικού δέντρου σε JavaScript
Πριν βουτήξουμε στις λειτουργίες και τις βέλτιστες πρακτικές, είναι σημαντικό να κατανοήσουμε πώς να εφαρμόσουμε ένα δυαδικό δέντρο σε JavaScript. Υπάρχουν διάφοροι τρόποι για να γίνει αυτό, αλλά ένας από τους πιο συνηθισμένους είναι η χρήση μαθημάτων και παραπομπών σε παιδιά. Ακολουθεί ένα βασικό παράδειγμα για το πώς θα μοιάζει μια εφαρμογή δυαδικού δέντρου σε JavaScript:
class Nodo {
constructor(valor) {
this.valor = valor;
this.izquierdo = null;
this.derecho = null;
}
}
class ArbolBinario {
constructor() {
this.raiz = null;
}
// Métodos del árbol binario
}
Σε αυτό το παράδειγμα, δημιουργούμε μια κλάση Nodo που αντιπροσωπεύει κάθε κόμβο του δέντρου και μια κλάση ArbolBinario η οποία είναι υπεύθυνη για τη διαχείριση της δομής και των λειτουργιών του δέντρου. Κάθε κόμβος έχει μια τιμή και αναφορές στα αριστερά και δεξιά παιδιά του, αρχικοποιημένα ως null αθέτηση. Η ρίζα του δέντρου αντιπροσωπεύεται από το χαρακτηριστικό raiz της τάξης ArbolBinario.
Βασικές λειτουργίες σε δυαδικά δέντρα
Αφού εφαρμόσετε ένα δυαδικό δέντρο σε JavaScript, μπορείτε να εκτελέσετε μια ποικιλία βασικών λειτουργιών σε αυτό. Αυτές οι λειτουργίες σάς επιτρέπουν να προσθέσετε, να αφαιρέσετε και να αναζητήσετε στοιχεία στο δέντρο. Ας δούμε μερικές από τις πιο συνηθισμένες λειτουργίες:
Εισαγωγή στοιχείου σε δυαδικό δέντρο
Η εισαγωγή ενός στοιχείου σε ένα δυαδικό δέντρο περιλαμβάνει την εύρεση της σωστής θέσης για τον νέο κόμβο και τη σωστή σύνδεσή του με τους υπάρχοντες κόμβους. Ακολουθεί ένα παράδειγμα για το πώς μπορεί να εφαρμοστεί η εισαγωγή ενός στοιχείου σε ένα δυαδικό δέντρο:
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);
}
}
}
}
Σε αυτό το παράδειγμα, η συνάρτηση insertar(valor) δημιουργεί έναν νέο κόμβο με την καθορισμένη τιμή και ελέγχει εάν η ρίζα του δέντρου είναι null. Εάν ναι, ορίστε τον νέο κόμβο ως root. Διαφορετικά, καλέστε τη συνάρτηση insertarNodo(nodo, nuevoNodo) για να βρείτε τη σωστή θέση για τον νέο κόμβο.
Αναζήτηση για ένα στοιχείο σε ένα δυαδικό δέντρο
Η αναζήτηση ενός στοιχείου σε ένα δυαδικό δέντρο περιλαμβάνει τη διέλευση του δέντρου με ταξινομημένο τρόπο για να βρεθεί ο κόμβος που περιέχει την επιθυμητή τιμή. Ακολουθεί ένα παράδειγμα του τρόπου με τον οποίο μπορεί να εφαρμοστεί η αναζήτηση για ένα στοιχείο σε ένα δυαδικό δέντρο:
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);
}
}
}
Σε αυτό το παράδειγμα, η συνάρτηση buscar(valor) επικαλείται τη συνάρτηση buscarNodo(nodo, valor) περνώντας τη ρίζα του δέντρου και την τιμή που θέλετε να αναζητήσετε. Η λειτουργία buscarNodo(nodo, valor) εκτελεί μια αναδρομική αναζήτηση στο δέντρο, ελέγχοντας εάν ο τρέχων κόμβος είναι null ή εάν η τιμή του ταιριάζει με την τιμή που αναζητήσατε. Ανάλογα με τη σύγκριση, η αναζήτηση συνεχίζεται για το αριστερό ή το δεξί παιδί.
Διαγραφή στοιχείου σε δυαδικό δέντρο
Η αφαίρεση ενός στοιχείου σε ένα δυαδικό δέντρο μπορεί να είναι λίγο πιο περίπλοκη, καθώς πρέπει να εξετάσετε διαφορετικές περιπτώσεις ανάλογα με τη δομή του δέντρου. Ακολουθεί ένα παράδειγμα του τρόπου με τον οποίο μπορεί να εφαρμοστεί η αφαίρεση ενός στοιχείου από ένα δυαδικό δέντρο:
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;
}
}
Σε αυτό το παράδειγμα, η συνάρτηση eliminar(valor) επικαλείται τη συνάρτηση eliminarNodo(nodo, valor) περνώντας τη ρίζα του δέντρου και την τιμή που πρέπει να διαγραφεί. Η λειτουργία eliminarNodo(nodo, valor) εκτελεί μια αναδρομική διαγραφή, λαμβάνοντας υπόψη διαφορετικές περιπτώσεις ανάλογα με τη δομή του δέντρου. Αν ο τρέχων κόμβος είναι null, επιστρέφεται null. Εάν η τιμή αναζήτησης είναι μικρότερη από την τιμή του τρέχοντος κόμβου, η διαγραφή πραγματοποιείται στο αριστερό παιδί. Αν είναι μεγαλύτερο, γίνεται στον δεξιό γιο. Εάν ο κόμβος έχει και τα δύο παιδιά, βρίσκεται ο πλησιέστερος διάδοχος και εκτελείται μια εναλλαγή τιμών πριν αφαιρεθεί ο διάδοχος.
Προηγμένες λειτουργίες σε δυαδικά δέντρα
Εκτός από τις βασικές λειτουργίες, τα δυαδικά δέντρα υποστηρίζουν έναν αριθμό προηγμένων λειτουργιών που μπορούν να σας βοηθήσουν να εκτελέσετε πιο σύνθετες εργασίες. Αυτές οι λειτουργίες σάς επιτρέπουν να διασχίσετε το δέντρο με διαφορετικές σειρές, να υπολογίσετε το ύψος του, να ελέγξετε αν είναι ισορροπημένο και πολλά άλλα. Θα εξερευνήσουμε μερικές από αυτές τις λειτουργίες παρακάτω.
Κατά σειρά διέλευση ενός δυαδικού δέντρου
Η αυθόρμητη διέλευση ενός δυαδικού δέντρου περιλαμβάνει την επίσκεψη κόμβων με την ακόλουθη σειρά: πρώτα το αριστερό παιδί, μετά ο τρέχων κόμβος και τέλος το δεξί παιδί. Αυτός ο τύπος διέλευσης είναι χρήσιμος για τη λήψη των στοιχείων του δέντρου σε αύξουσα σειρά. Ακολουθεί ένα παράδειγμα του τρόπου υλοποίησης της διέλευσης κατά σειρά ενός δυαδικού δέντρου:
class ArbolBinario {
// ...
recorridoEnOrden() {
this.recorrerEnOrden(this.raiz);
}
recorrerEnOrden(nodo) {
if (nodo !== null) {
this.recorrerEnOrden(nodo.izquierdo);
console.log(nodo.valor);
this.recorrerEnOrden(nodo.derecho);
}
}
}
Σε αυτό το παράδειγμα, η συνάρτηση recorridoEnOrden() επικαλείται τη συνάρτηση recorrerEnOrden(nodo) περνώντας τη ρίζα του δέντρου. Η λειτουργία recorrerEnOrden(nodo) εκτελεί μια αναδρομική διέλευση κατά σειρά, εκτυπώνοντας την τιμή του τρέχοντος κόμβου μεταξύ των κλήσεων προς τα αριστερά και τα δεξιά παιδιά.
Προπαραγγελία διέλευσης δυαδικού δέντρου
Η διέλευση προπαραγγελίας ενός δυαδικού δέντρου περιλαμβάνει την επίσκεψη κόμβων με την ακόλουθη σειρά: πρώτα ο τρέχων κόμβος, μετά το αριστερό παιδί και τέλος το δεξί παιδί. Αυτός ο τύπος περιήγησης είναι χρήσιμος για τη δημιουργία αντιγράφου του δέντρου ή για την εκτύπωση μιας οπτικής αναπαράστασής του. Ακολουθεί ένα παράδειγμα του τρόπου υλοποίησης της διέλευσης προπαραγγελίας ενός δυαδικού δέντρου:
class ArbolBinario {
// ...
recorridoPreOrden() {
this.recorrerPreOrden(this.raiz);
}
recorrerPreOrden(nodo) {
if (nodo !== null) {
console.log(nodo.valor);
this.recorrerPreOrden(nodo.izquierdo);
this.recorrerPreOrden(nodo.derecho);
}
}
}
Σε αυτό το παράδειγμα, η συνάρτηση recorridoPreOrden() επικαλείται τη συνάρτηση recorrerPreOrden(nodo) περνώντας τη ρίζα του δέντρου. Η λειτουργία recorrerPreOrden(nodo) εκτελεί μια αναδρομική διέλευση σε προπαραγγελία, εκτυπώνοντας την τιμή του τρέχοντος κόμβου πριν καλέσει το αριστερό και το δεξί παιδί.
Διέλευση δυαδικού δέντρου μετά παραγγελία
Η διέλευση μετα-παραγγελίας ενός δυαδικού δέντρου περιλαμβάνει την επίσκεψη κόμβων με την ακόλουθη σειρά: πρώτα το αριστερό παιδί, μετά το δεξί παιδί και τέλος ο τρέχων κόμβος. Αυτός ο τύπος διέλευσης είναι χρήσιμος για την απελευθέρωση μνήμης που καταλαμβάνεται από το δέντρο ή για την εκτέλεση λειτουργιών που εξαρτώνται από παιδιά πριν από την επεξεργασία του τρέχοντος κόμβου. Ακολουθεί ένα παράδειγμα του τρόπου υλοποίησης της διέλευσης μετά την παραγγελία ενός δυαδικού δέντρου:
class ArbolBinario {
// ...
recorridoPostOrden() {
this.recorrerPostOrden(this.raiz);
}
recorrerPostOrden(nodo) {
if (nodo !== null) {
this.recorrerPostOrden(nodo.izquierdo);
this.recorrerPostOrden(nodo.derecho);
console.log(nodo.valor);
}
}
}
Σε αυτό το παράδειγμα, η συνάρτηση recorridoPostOrden() επικαλείται τη συνάρτηση recorrerPostOrden(nodo) περνώντας τη ρίζα του δέντρου. Η λειτουργία recorrerPostOrden(nodo) εκτελεί μια αναδρομική διέλευση μετα-παραγγελίας, καλώντας πρώτα το αριστερό και το δεξί παιδί και μετά εκτυπώνοντας την τιμή του τρέχοντος κόμβου.
Βέλτιστες πρακτικές για εργασία με δυαδικά δέντρα σε JavaScript
Τώρα που έχετε κατανοήσει καλά τις βασικές και προηγμένες λειτουργίες σε δυαδικά δέντρα σε JavaScript, είναι σημαντικό να έχετε κατά νου ορισμένες βέλτιστες πρακτικές για την εργασία με αυτά. Αυτές οι πρακτικές θα σας βοηθήσουν να γράψετε πιο ευανάγνωστο, αποτελεσματικό και διατηρήσιμο κώδικα:
- Τεκμηριώστε τον κωδικό σας σωστά:Τα δυαδικά δέντρα μπορούν γρήγορα να γίνουν πολύπλοκα, επομένως είναι κρίσιμο να τεκμηριώσετε τον κώδικά σας με σαφήνεια και περιεκτικότητα. Εξηγήστε τον σκοπό κάθε μεθόδου, τις παραμέτρους της και την αναμενόμενη τιμή επιστροφής. Αυτό θα κάνει τον κώδικα πιο κατανοητό για εσάς και άλλους προγραμματιστές που ενδέχεται να εργαστούν στο έργο στο μέλλον.
- Χρησιμοποιήστε περιγραφικά ονόματα για μεταβλητές και μεθόδους: Επιλέξτε ονόματα που αντικατοπτρίζουν τον σκοπό και τη λειτουργία κάθε μεταβλητής και μεθόδου στη δυαδική δενδρική υλοποίηση. Αυτό θα κάνει τον κώδικά σας πιο ευανάγνωστο και κατανοητό, διευκολύνοντας τη συντήρηση και τον εντοπισμό σφαλμάτων.
- Εκτελέστε εκτεταμένες δοκιμές: Πριν χρησιμοποιήσετε την υλοποίηση του δυαδικού δέντρου σε ένα πραγματικό έργο, φροντίστε να εκτελέσετε διεξοδικές δοκιμές για να επαληθεύσετε ότι λειτουργεί σωστά. Δημιουργήστε δοκιμαστικές περιπτώσεις που καλύπτουν διαφορετικά σενάρια και επαληθεύστε ότι τα αποτελέσματα είναι τα αναμενόμενα. Αυτό θα σας βοηθήσει να εντοπίσετε πιθανά σφάλματα και να διασφαλίσετε ότι η εφαρμογή σας είναι αξιόπιστη.
- Σκεφτείτε την αποτελεσματικότητα:Τα δυαδικά δέντρα μπορούν να προσφέρουν μεγάλη αποτελεσματικότητα στον χειρισμό και την αναζήτηση δεδομένων, αλλά είναι σημαντικό να λάβετε υπόψη την αποτελεσματικότητα της υλοποίησής σας. Αξιολογήστε την απόδοση των αλγορίθμων σας και αναζητήστε ευκαιρίες για να τους βελτιστοποιήσετε εάν είναι απαραίτητο. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε τεχνικές εξισορρόπησης δέντρων για να διασφαλίσετε ότι το ύψος του δέντρου παραμένει σε αποδεκτά επίπεδα.
- Εκμεταλλευτείτε τις υπάρχουσες βιβλιοθήκες και πόρους: Η JavaScript διαθέτει μια μεγάλη ποικιλία βιβλιοθηκών και πόρων που μπορούν να σας βοηθήσουν να εργαστείτε με δυαδικά δέντρα πιο αποτελεσματικά. Ερευνήστε και χρησιμοποιήστε βιβλιοθήκες όπως binarytree ή bintrees για να επωφεληθείτε από ήδη δοκιμασμένες και βελτιστοποιημένες υλοποιήσεις. Επιπλέον, συμβουλευτείτε την επίσημη τεκμηρίωση JavaScript και αξιόπιστους διαδικτυακούς πόρους για να επεκτείνετε τις γνώσεις σας και να λύσετε πιθανές προκλήσεις.
- Σχολιάστε τον κωδικό σας: Εκτός από την εξωτερική τεκμηρίωση, είναι σημαντικό να προσθέσετε σχετικά σχόλια στον κώδικά σας. Εξηγεί τον σκοπό ορισμένων τμημάτων ή γραμμών κώδικα, καθώς και τους αλγόριθμους ή τις προσεγγίσεις που χρησιμοποιούνται. Αυτό θα βοηθήσει άλλους προγραμματιστές (και τον εαυτό σας στο μέλλον) να κατανοήσουν γρήγορα πώς λειτουργεί η εφαρμογή σας.
Συχνές ερωτήσεις
Ακολουθούν ορισμένες συχνές ερωτήσεις σχετικά με τα δυαδικά δέντρα στο JavaScript:
- Ποια είναι η διαφορά μεταξύ ενός δυαδικού δέντρου και ενός δυαδικού δέντρου αναζήτησης; Ένα δυαδικό δέντρο είναι μια ιεραρχική δομή δεδομένων στην οποία κάθε κόμβος μπορεί να έχει έως και δύο παιδιά. Ένα δυαδικό δέντρο αναζήτησης είναι ένας συγκεκριμένος τύπος δυαδικού δέντρου στο οποίο οι τιμές των κόμβων είναι διατεταγμένες έτσι ώστε οι μικρότερες τιμές να βρίσκονται στο αριστερό παιδί και οι μεγαλύτερες τιμές στο δεξί παιδί. Αυτό επιτρέπει αποτελεσματικές αναζητήσεις στο δέντρο.
- Πότε πρέπει να χρησιμοποιήσετε ένα δυαδικό δέντρο αντί για άλλες δομές δεδομένων; Θα πρέπει να χρησιμοποιείτε ένα δυαδικό δέντρο όταν χρειάζεστε μια αποτελεσματική δομή δεδομένων για να οργανώσετε και να αποθηκεύσετε δεδομένα ιεραρχικά. Τα δυαδικά δέντρα είναι ιδιαίτερα χρήσιμα όταν χρειάζεται να εκτελέσετε αποτελεσματικά λειτουργίες αναζήτησης, εισαγωγής και διαγραφής.
- Είναι δυνατό να εξισορροπηθεί ένα δυαδικό δέντρο μετά την εκτέλεση πολλαπλών λειτουργιών εισαγωγής και διαγραφής; Ναι, είναι δυνατό να εξισορροπηθεί ένα δυαδικό δέντρο μετά την εκτέλεση πολλών λειτουργιών εισαγωγής και διαγραφής. Υπάρχουν διαφορετικοί αλγόριθμοι εξισορρόπησης, όπως το δέντρο AVL ή το κόκκινο-μαύρο δέντρο, που διασφαλίζουν ότι το ύψος του δέντρου διατηρείται στα βέλτιστα επίπεδα και εμποδίζουν το δέντρο να μην ισορροπήσει.
- Τα δυαδικά δέντρα χρησιμοποιούνται μόνο για την αποθήκευση αριθμητικών δεδομένων; Όχι, τα δυαδικά δέντρα μπορούν να χρησιμοποιηθούν για την αποθήκευση οποιουδήποτε τύπου δεδομένων, όχι μόνο αριθμητικών δεδομένων. Μπορείτε να εφαρμόσετε δυαδικά δέντρα που αποθηκεύουν συμβολοσειρές κειμένου, προσαρμοσμένα αντικείμενα ή άλλους τύπους δεδομένων ανάλογα με τις ανάγκες σας.
- Υπάρχει κάποια βιβλιοθήκη JavaScript για εργασία με δυαδικά δέντρα; Ναι, υπάρχουν αρκετές βιβλιοθήκες JavaScript που προσφέρουν προηγμένη λειτουργικότητα για εργασία με δυαδικά δέντρα. Μερικές από τις δημοφιλείς βιβλιοθήκες περιλαμβάνουν τις "binarytree", "bintrees" και "d3-binarytree". Αυτές οι βιβλιοθήκες σάς παρέχουν μια έτοιμη προς χρήση υλοποίηση και πρόσθετες λειτουργίες για εργασία με δυαδικά δέντρα.
- Ποιες είναι οι πρακτικές εφαρμογές των δυαδικών δέντρων στον πραγματικό κόσμο; Τα δυαδικά δέντρα χρησιμοποιούνται σε μια ποικιλία πραγματικών εφαρμογών όπως βάσεις δεδομένων, αλγόριθμοι αναζήτησης, αλγόριθμοι συμπίεσης, συστήματα αρχείων και πολλά άλλα. Είναι απαραίτητα για την αποτελεσματική οργάνωση και αναζήτηση δεδομένων σε πολλά συστήματα και εφαρμογές.
Συμπέρασμα
Τα δυαδικά δέντρα στο JavaScript είναι ένα ισχυρό εργαλείο για την αποτελεσματική οργάνωση και χειρισμό δεδομένων. Σε αυτό το άρθρο, μάθατε τα βασικά των δυαδικών δέντρων, πώς να τα εφαρμόσετε σε JavaScript και τις βασικές και προηγμένες λειτουργίες που μπορείτε να εκτελέσετε σε αυτά. Επιπλέον, εξερευνήσαμε ορισμένες βέλτιστες πρακτικές και απαντήσαμε σε συχνές ερωτήσεις για να σας βοηθήσουμε να διευρύνετε τις γνώσεις σας.
Τώρα που έχετε κατανοήσει καλά τα δυαδικά δέντρα στο JavaScript, ήρθε η ώρα να εφαρμόσετε αυτή τη γνώση στα έργα σας και να εξερευνήσετε περαιτέρω τις δυνατότητες που προσφέρει αυτή η δομή δεδομένων. Επεκτείνετε τις προγραμματιστικές σας δεξιότητες και πηγαίνετε τον κώδικά σας στο επόμενο επίπεδο με δυαδικά δέντρα σε JavaScript!