Underc0de - Hacking y seguridad informática

Programación Web => Front-end => Mensaje iniciado por: Adalher en Noviembre 16, 2020, 11:08:13 pm

Título: JavaScript - Árbol binario inmutable
Publicado por: Adalher en Noviembre 16, 2020, 11:08:13 pm
Hola a todos,

pensé en publicar algo que no se ve todos los días en JavaScript. Un árbol binario inmutable y ordenado al que se le puede agregar, eliminar, y mostrar datos.

Código: Javascript
  1. class Vacio {
  2.   constructor() {
  3.     Object.freeze(this);
  4.   }
  5.   agregar(datos) {
  6.     return new Nodo(datos, this, this);
  7.   }
  8.   mostrar() {
  9.     console.log("vacio");
  10.   }
  11.   encontrar(_) {
  12.     return this;
  13.   }
  14.   eliminar(_) {
  15.     return this;
  16.   }
  17.   unir_ramas(izquierda, _) {
  18.     return izquierda;
  19.   }
  20. }
  21.  
  22. class Nodo {
  23.   constructor(datos, izquierda, derecha) {
  24.     this.datos = datos;
  25.     this.izquierda = izquierda;
  26.     this.derecha =derechas;
  27.     Object.freeze(this);
  28.   }
  29.   agregar(datos) {
  30.     if (this.datos < datos) {
  31.       return new Nodo(this.datos, this.izquierda.agregar(datos), this.derecha);
  32.     } else if (this.datos > datos) {
  33.       return new Nodo(this.datos, this.izquierda, this.derecha.agregar(datos));
  34.     } else {
  35.       return this;
  36.     }
  37.   }
  38.   mostrar() {
  39.     this.izquierda.mostrar();
  40.     console.log(this.datos);
  41.     this.derecha.mostrar();
  42.   }
  43.   encontrar(datos) {
  44.     if (this.datos < datos) {
  45.       return this.izquierda.encontrar(datos);
  46.     } else if (this.datos > datos) {
  47.       return this.derecha.encontrar(datos);
  48.     } else {
  49.       return this;
  50.     }
  51.   }
  52.   eliminar(datos) {
  53.     if (this.datos < datos) {
  54.       return new Nodo(this.datos, this.izquierda.eliminar(datos), this.derecha);
  55.     } else if (this.datos > datos) {
  56.       return new Nodo(this.datos, this.izquierda, this.derecha.eliminar(datos));
  57.     } else {
  58.       if (this.izquierda === null) {
  59.         return this.derecha;
  60.       } else if (this.derecha === null) {
  61.         return this.izquierda;
  62.       } else {
  63.         return this.derecha.unir_ramas(this.izquierda);
  64.       }
  65.     }
  66.   }
  67.   unir_ramas(izquierda) {
  68.     return new Nodo(this.datos, this.izquierda.unir_ramas(izquierda), this.derecha);
  69.   }
  70. }
  71.  
  72. const arr = [10, 1, 9, 2, 8, 3, 7, 4, 6, 5].reduce((a, e) => { return a.agregar(e) }, new Vacio());
  73.  
  74. arr.mostrar();
  75.  
  76. console.log("\n\n");
  77.  
  78. (arr.encontrar(8)).mostrar();
  79.  
  80. console.log("\n\n");
  81.  
  82. const ans = [2, 4, 6, 8, 10, 1, 3, 5, 10, 10].reduce((a, e) => { return a.eliminar(e) }, arr);
  83.  
  84. ans.mostrar();
  85.  

Es solo algo con lo que estaba jugando mientras me familiarizaba con JavaScript. Lo sé, no es muy práctico en JavaScript pero necesito practicar en algo.


Saludos