Valores inversos de nodos alternativos del árbol -- java campo con algorithm campo con tree camp codereview Relacionados El problema

Reverse values of alternate nodes of the tree


3
vote

problema

Español

Dado un árbol binario perfecto, invierta los nodos de nivel alternativo del árbol binario.

DIVIDO EL ÁRBOL:

            a         /            b       c     /       /      d    e    f    g   /   /   /   /    h  i j  k l  m  n  o    

Árbol modificado:

            a         /             c       b      /       /       d    e    f    g    /   /   /   /    o  n m  l k  j  i  h    

Esta pregunta se atribuye a GeeksForGeeks. La diferencia entre esto y el que se resolvió antes aquí es que, en este caso, los" valores "se pueden cambiar en lugar de los nodos reales. Buscando revisión de código, optimizaciones y mejores prácticas.

  loadSmartConfig: function(changed) {             print("Smart Updating Data Now.")             var oldData = [],                 newData = [];             for (var key in this.Config) {                 if (this.Config[key] === this.Config.PunishTiers || this.Config[key] === this.Config.Titles || this.Config[key] === this.Config.Ranks) {                     oldData.push(this.Config[key]);                 if ((this.Config[key] === this.Config.Messages && this.Config.Message.Messages)                      || (this.Config[key] === this.Config.Prefix && this.Config.Prefix.Prefixes)                     || (this.Config[key] === this.Config.Settings && this.Config.Settings.Settings)) {                     oldData.push(this.Config[key]);                 }                 } else {                     continue;   }             }             if (oldData.length > 0) {                 this.LoadDefaultConfig();             }          if (this.Config.PunishTiers !== undefined && this.Config.Titles !== undefined && this.Config.Ranks !== undefined) {             for (var i = 0; i < oldData.length; i++) {                 if (oldData[i].length === 1) {                     this.Config.PunishTiers = oldData[i];                 } else if (oldData[i].hasOwnProperty("authLvl")) {                     this.Config.Titles = oldData[i];                 } else if (oldData[i].hasOwnProperty("rank")) {                     this.Config.Ranks = oldData[i];                 } else if (oldData[i].hasOwnProperty("Messages") && oldData[i].Messages) {                     this.Config.Messages = oldData[i];                 } else if (oldData[i].hasOwnProperty("Prefixes") && oldData[i].Prefixes) {                     this.Config.Prefix = oldData[i];                 } else if (oldData[i].hasOwnProperty("Settings") && oldData[i].Settings){                     this.Config.Settings = oldData[i];                 }             }             this.SaveConfig();         }, 0  
Original en ingles

Given a Perfect Binary Tree, reverse the alternate level nodes of the binary tree.

Given tree:

          a         /     \       b       c     /  \     /  \    d    e    f    g   / \  / \  / \  / \   h  i j  k l  m  n  o  

Modified tree:

          a         /     \        c       b      /  \     /  \     d    e    f    g    / \  / \  / \  / \   o  n m  l k  j  i  h  

This question is attributed to GeeksForGeeks. The difference between this and the one solved by me previously here, is that in this case the "values" can be changed rather than the actual nodes. Looking for code review, optmizations and best practices.

public class SwapTreeLevelsValues<T> {      private TreeNode<T> root;      public SwapTreeLevelsValues(List<T> nodes) {         create(nodes);     }      private void create (List<T> items) {                 root = new TreeNode<>(items.get(0));          final Queue<TreeNode<T>> queue = new LinkedList<TreeNode<T>>();         queue.add(root);          final int half = items.size() / 2;          for (int i = 0; i < half; i++) {             if (items.get(i) != null) {                 final TreeNode<T> current = queue.poll();                 final int left = 2 * i + 1;                 final int right = 2 * i + 2;                  if (items.get(left) != null) {                     current.left = new TreeNode<T>(items.get(left));                     queue.add(current.left);                 }                 if (right < items.size() && items.get(right) != null) {                     current.right = new TreeNode<T>(items.get(right));                     queue.add(current.right);                 }             }         }     }       public static class TreeNode<T> {         private TreeNode<T> left;         private T item;         private TreeNode<T> right;          TreeNode(T item) {              this.item = item;         }     }      /**      * Given a perfect binary tree, swaps the even levels.      * For an non-perfect binary tree, results are unpredictable.      */     public void reverseAlternateLevels() {         if (root == null) {             throw new IllegalStateException("The root cannot be null");          }         reverse(root, root, true);     }       private void reverse (TreeNode<T> node1, TreeNode<T> node2, boolean level) {         if (node1 == null) {             return;         }          reverse(node1.left, node2.right, !level);          if (node1 == root) return;          if (level) {             T temp = node1.item;              node1.item = node2.item;             node2.item = temp;         }           reverse(node1.right, node2.left, !level);     }       @Override     public int hashCode() {         return hashCompute(root, 0);     }      public int hashCompute (TreeNode<T> node, int item) {         if (node == null) return item;         item = 31 * hashCompute (node.left, item) + node.hashCode();         return hashCompute(node.right, item);     }       @Override     public boolean equals(Object obj) {         if (this == obj)             return true;         if (obj == null)             return false;         if (getClass() != obj.getClass())             return false;         SwapTreeLevelsValues<T> other = (SwapTreeLevelsValues<T>) obj;         return equal(root, other.root);     }       private boolean equal(TreeNode<T> node1, TreeNode<T> node2) {         if (node1 == null && node2 == null) return true;         if (node1 == null || node2 == null) return false;         if (node1.item != node2.item) {             return false;         }          return equal(node1.left, node2.left) && equal(node1.right, node2.right);     } }  public class SwapTreeLevelValuesTest {       @Test     public void test() {         List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31); ;         List<Integer> list2 = Arrays.asList(1, 2, 3, 7, 6, 5, 4, 8, 9, 10, 11, 12, 13, 14, 15, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16);          SwapTreeLevelsValues<Integer> stlv1 = new SwapTreeLevelsValues<>(list1);         stlv1.reverseAlternateLevels();         SwapTreeLevelsValues<Integer> stlv2 = new SwapTreeLevelsValues<>(list2);         System.out.println(stlv2.equals(stlv2));     } } 
        
   
   

Lista de respuestas

3
 
vote

Un error menor: obtiene un 99887766555443315 para una lista vacía en var pushRequired = false; pushRequired |= this.Config[key] === this.Config.PunishTiers; pushRequired |= this.Config[key] === this.Config.Titles; pushRequired |= this.Config[key] === this.Config.Ranks; pushRequired |= this.Config[key] === this.Config.Messages && this.Config.Message.Messages; pushRequired |= this.Config[key] === this.Config.Prefix && this.Config.Prefix.Prefixes; pushRequired |= this.Config[key] === this.Config.Settings && this.Config.Settings.Settings; if(pushRequired){ oldData.push(this.Config[key]); } 6 . No tiene un comentario que indique que necesita ingresar una lista que contenga al menos algo. Considere devolver var pushRequired = false; pushRequired |= this.Config[key] === this.Config.PunishTiers; pushRequired |= this.Config[key] === this.Config.Titles; pushRequired |= this.Config[key] === this.Config.Ranks; pushRequired |= this.Config[key] === this.Config.Messages && this.Config.Message.Messages; pushRequired |= this.Config[key] === this.Config.Prefix && this.Config.Prefix.Prefixes; pushRequired |= this.Config[key] === this.Config.Settings && this.Config.Settings.Settings; if(pushRequired){ oldData.push(this.Config[key]); } 7 y agregar un comentario.


Tuve que hacer una doble toma aquí:

  var pushRequired = false; pushRequired |= this.Config[key] === this.Config.PunishTiers; pushRequired |= this.Config[key] === this.Config.Titles; pushRequired |= this.Config[key] === this.Config.Ranks; pushRequired |= this.Config[key] === this.Config.Messages && this.Config.Message.Messages; pushRequired |= this.Config[key] === this.Config.Prefix && this.Config.Prefix.Prefixes; pushRequired |= this.Config[key] === this.Config.Settings && this.Config.Settings.Settings; if(pushRequired){     oldData.push(this.Config[key]); } 8  

Solo tenía sentido después de mirar el diagrama. Aún así, estás haciendo un cálculo dos veces ... ¿Por qué no hacerlo así?

  var pushRequired = false; pushRequired |= this.Config[key] === this.Config.PunishTiers; pushRequired |= this.Config[key] === this.Config.Titles; pushRequired |= this.Config[key] === this.Config.Ranks; pushRequired |= this.Config[key] === this.Config.Messages && this.Config.Message.Messages; pushRequired |= this.Config[key] === this.Config.Prefix && this.Config.Prefix.Prefixes; pushRequired |= this.Config[key] === this.Config.Settings && this.Config.Settings.Settings; if(pushRequired){     oldData.push(this.Config[key]); } 9  

Dicho esto, puedes querer poner un comentario allí. No es una línea de código trivial.

Mirando un poco ...

  pushRequired0  

No está modificando pushRequired1 . ¿Es posible para pushRequired2 no devolver pushRequired3 una vez que ha regresado nulo? Si no, ¿por qué no romper el bucle para el bucle, en lugar de pasar por los bucles restantes? (Rendimiento al tratar con grandes treemaps).

No puedo encontrar nada más, de verdad.

 

A minor bug: You get an IndexOutOfBoundsException for an empty list in SwapTreeLevelsValues.create(List<T> items). You don't have a comment stating you need to input a list containing at least something. Consider returning IllegalArgumentException and adding a comment.


I had to do a double take here:

final int left = 2 * i + 1; final int right = 2 * i + 2; 

It only made sense after looking at the diagram. Still, you're doing a calculation twice... why not do it like this?

final int left = 2 * i + 1; final int right = left + 1; 

That said, you might wanna put a comment there. It's not a trivial line of code.

Looking up a bit...

final int half = items.size() / 2;  for (int i = 0; i < half; i++) {     if (items.get(i) != null) { 

You're not modifying items. Is it possible for items.get(i) to not return null once it has once returned null? If not, why not break out of the for loop, rather than going through the remaining loops? (Performance when dealing with large TreeMaps).

I can't find anything else, really.

 
 

Relacionados problema

4  Función abstracta del mapa del árbol  ( Abstract tree map function ) 
Ejercicio 2.31. Resumen tu respuesta Para ejercer 2.30 para producir un Procedimiento Árbol - Mapa con la propiedad. ese árbol cuadrado podría definirs...

2  Eliminación de un nodo en un árbol de búsqueda binario  ( Deletion of a node in a binary search tree ) 
Estoy buscando ver si mi implementación del método de eliminación / eliminación en un árbol de búsqueda binario es suficiente, legible y se ejecuta en un tiem...

3  Incrustar un HTML (cadena) generado de un árbol estructurado de árbol  ( Embedding an html string generated from a tree structured json ) 
Cómo hacer insertJson3 FASTER (¿Debería mantener el script compatible con versiones anteriores de IE y otros navegadores)? Problema innerHTML de este ...

11  Patrones compuestos y de visitantes para la funcionalidad de la encuesta basada en árboles en C #  ( Composite and visitor patterns for tree based survey functionality in c ) 
He escrito alguna funcionalidad de encuesta para un proyecto. Básicamente, un formulario de encuesta genérico que se puede componer de secciones y preguntas. ...

2  Implementación de árboles de búsqueda de ternarios en Python 3  ( Ternary search tree implementation in python 3 ) 
He implementado un árbol de búsqueda ternario. Funciona bien. Pero si crees que algo necesita mejorarse, dígalo. Este código fue probado en Python 3.7.4. c...

4  Eliminar nodos alternativos de una lista vinculada  ( Delete alternate nodes of a linked list ) 
Si la lista vinculada es 1- & gt; 2- & gt; 3- & gt; 4 entonces la salida debe ser 1- & gt; 3. Si la lista vinculada es 1- & gt; 2- & gt; 3- & gt; 4- & gt; 5,...

1  Retire todos los nodos que no se encuentren en ningún camino con suma> = k  ( Remove all nodes which dont lie in any path with sum k ) 
Dado un árbol binario, una ruta completa se define como un camino desde la raíz a una hoja. La suma de todos los nodos en ese camino se define como la suma d...

13  Árbol de búsqueda binaria - C ++  ( Binary search tree c ) 
Estoy implementando varias estructuras de datos en un intento por aprender C ++. A continuación se muestra un árbol de búsqueda binario que he implementado pa...

2  Montón Binomial en Java  ( Binomial heap in java ) 
Tengo esta implementación de un montón de binomio que proporciona inserto, disminución de la tecla y el extracto en el tiempo logarítmico. minpriorityqueue...

12  Codificación de árbol binario  ( Binary tree encoding ) 
Implementé una solución a este desafío de codificación en el código de golf. Tengo experiencia decente con C / C ++, pero ha sido un tiempo desde que los us...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos