Dado un árbol de búsqueda binario finito T en el que cada nodo contiene datos enteros, puntero a su hijo izquierdo, puntero a su hijo derecho y un puntero al sucesor transversal en orden (que inicialmente se establece en nulo). ¿Puede establecer los punteros transversales en orden de todos los nodos?

  void setInorderPointers (TreeNode * root)
 {
	 if (root == NULL) return;

	 std :: stack  s;
	 s.push (raíz);
	 TreeNode * temp = root-> left;
	 TreeNode * last_pop = NULL;	
	
	 while (s.size ()! = 0)
	 {
		 while (temp! = NULL)
		 {
			 s.push (temp);
			 temp = temp-> izquierda;
		 }
		
		 temp = (TreeNode *) s.pop ();
		 if (last_pop! = NULL)
		 {
			 last_pop-> inorder_successor = temp;
		 }
		 last_pop = temp;
		 temp = temp-> right;
	 }
 }

El algoritmo es:

  • Comience a hacer el recorrido iterativo en orden del árbol. Esto se hace a través de la estructura de datos de la pila.
  • Cada vez que sacamos un nodo de la pila, básicamente estamos haciendo estallar el nodo que viene en la posición n en el recorrido en orden del árbol. n puede ser cualquier cosa entre 1 y max donde max es el número de nodos en el árbol.
  • Llevamos un registro del último nodo reventado.
  • Cada vez que hacemos estallar un nodo, establecemos el puntero inorder_successor del último nodo emergente en el nodo emergente actual, apuntando el sucesor de orden del enésimo nodo al nodo (N + 1).

/* Perform an in-order traversal of the tree rooted at root, and * set the next field of each node to its in-order successor. */ void setTraversalPointers(Node root) { Node last = setTraversalPointers(root, null); last.next = null; } /* curr The node currently being processed. * prev The earliest node which has not yet had its next field initialized. * * return The rightmost node in the subtree rooted at the current node, * or prev if curr is null. */ Node setTraversalPointers(Node curr, Node prev) { if (curr == null) { return prev; } // Recursively traverse our left subtree. prev will be set to the rightmost // node in that subtree, or will be unchanged if the subtree is null. prev = setTraversalPointers(curr.left, prev); // The current node is the successor of the previous node. if (prev != null) { prev.next = curr; } // Traverse our right subtree with curr as the earliest unprocessed node. // The rightmost node rooted at us is the same as the rightmost node // of our right subtree. If we have no right subtree, then we will return // curr. return setTraversalPointers(curr.right, curr); } 

More Interesting

¿Cómo debo prepararme para una entrevista de pasantía de ingeniero de software (o desarrollador) en IBM?

Cómo completar esta tarea de programación

¿Cuál es el enfoque algorítmico para encontrar la ruta en una matriz booleana bidimensional que tiene más 1s?

¿Cuáles son las preguntas que se hacen en una TI (entrevista técnica) y una PI (entrevista personal) en el sistema de reclutamiento de Dell?

¿Qué tipo de libros recomienda leer mientras se prepara para codificar entrevistas?

¿Cómo se escribe una función para determinar el nodo en un árbol a la máxima profundidad, rompiendo los lazos con preferencia a los nodos más a la derecha?

Antes de una entrevista, ¿los entrevistadores de las principales compañías de software están actualizando su conocimiento de algoritmos / estructura de datos?

¿En qué áreas debe concentrarse un programador Java experimentado de nueve años mientras se prepara para una entrevista tecnológica en Amazon IDC?

¿Cómo debería (un estudiante de tercer año de ingeniería informática) mejorar mis posibilidades de entrevistas de prácticas?

¿Cómo me preparo para las rondas técnicas en las entrevistas del campus?

¿Qué opinas de CodePair by HackerRank?

Programación de acertijos: Te dan n dados cada uno con caras numeradas del 1 al m. Lanzas los n dados y anotas la suma de los números en los n dados. Te dan un número x. Considérelo una ganancia si la suma obtenida es mayor que x. Encuentre la probabilidad de ganar dado n, m y x.

¿Cómo son las entrevistas de Google Internship Host Matching?

Cómo pasar las entrevistas de codificación para una pasantía en Facebook, Google, Microsoft, etc.

¿En qué sitios web de programación competitiva debería comenzar si termino el curso del algoritmo MIT?