¿Cómo se vinculan los nodos al mismo nivel en un árbol binario?

Un enfoque simple es utilizar el recorrido de orden de nivel y seguir actualizando los siguientes punteros. Al atravesar, vincularemos los nodos en el siguiente nivel. Si el nodo tiene nodo izquierdo y derecho, vincularemos de izquierda a derecha. Si el nodo tiene el siguiente nodo, entonces vincule el hijo más a la derecha del nodo actual al hijo más a la izquierda del siguiente nodo.

  vacío linkNodesOfSameLevel (struct BinaryTreeNode * root) {
     struct Queue * Q = CreateQueue ();
     struct BinaryTreeNode * prev;
     struct BinaryTreeNode * temp;
     int currentLevelNodeCount, nextLevelNodeCount;
     if (! root)
         regreso;

     EnQueue (Q, raíz);
     currentLevelNodeCount = 1;
     nextLevelNodeCount = 0;
     prev = NULL;

     while (! IsEmptyQueue (Q)) {
         temp = DeQueue (Q);

         if (temp -> left) {
             EnQueue (Q, temp -> izquierda);
             nextLevelNodeCount ++;
         }
         if (temp -> right) {
             EnQueue (Q, temp -> derecha);
             nextLevelNodeCount ++;
         }

         si (anterior)
             prev -> siguiente = temp;

         prev = temp;

         currentLevelNodeCount--;
         if (currentLevelNodeCount == 0) {
             currentLevelNodeCount = nextLevelNodeCount;
             nextLevelNodeCount = 0;
             prev = NULL;
         }
     }
 }

 Complejidad del tiempo: O (n). Complejidad del espacio: O (n).

 Mejora: podemos procesar el nivel de árbol por nivel, pero sin una cola. La parte lógica es que cuando procesamos los nodos del siguiente nivel, nos aseguramos de que el nivel actual ya esté vinculado.

 vacío linkNodesOfSameLevel (struct BinaryTreeNode * root) {
     if (! root)
         regreso;
     struct BinaryTreeNode * rightMostNode = NULL, * nextHead = NULL, * temp = root;
     while (temp! = NULL) {
         if (temp -> left! = NULL)
             if (rightMostNode == NULL) {
                 rightMostNode = temp -> left;
                 nextHead = temp -> left;
             } más {
                 rightMostNode -> next = temp -> left;
                 rightMostNode = rightMostNode -> siguiente;
             }
         if (temp -> right! = NULL)
             if (rightMostNode == NULL) {
                 rightMostNode = temp -> right;
                 nextHead = temp -> right;
             } más {
                 rightMostNode -> next = temp -> right;
                 rightMostNode = rightMostNode -> siguiente;
             }
         temp = temp -> siguiente;
     }
     linkNodesOfSameLevel (nextHead);
 } 

Complejidad del tiempo: O (n). Complejidad espacial: O (1).

Aquí está el código C ++, estoy bastante seguro de que es comprensible. Por favor hazme saber si tienes preguntas.

  #include "cola"
 #include "vector"
 usando el espacio de nombres estándar;
 // Definición de árbol binario con el siguiente puntero.
  struct TreeLinkNode {
  int val;
  TreeLinkNode * left, * right, * next;
  TreeLinkNode (int x): val (x), left (NULL), right (NULL), next (NULL) {}
  };
  Solución de clase {
  público:
	  void connect (TreeLinkNode * root) {
		  if (! root)
			  regreso;
		  cola  q;
		  q.push (raíz);
		  vector  temp;
		  while (q.size ()) {
			  int s = q.size ();
			  temp.clear ();
			  para (int i = 0; i  izquierda)
					  q.push (q.front () -> izquierda);
				  if (q.front () -> right)
					  q.push (q.front () -> derecha);
				  temp.push_back (q.front ());
				  q.pop ();
			  }
			  temp.push_back (NULL);
			  for (auto i = 0; i  siguiente = temp [i + 1];
			  }
		  }
	  }
  };
 int main ()
 {
	 TreeLinkNode * root = new TreeLinkNode (1);
	 Solución s;
	 s.connect (raíz);
  devuelve 0;
 }

Es fácil de hacer al hacer una ligera modificación mientras se imprime el recorrido de orden de nivel línea por línea.

Recorrido de orden de nivel de impresión línea por línea – GeeksQuiz

> En lugar de imprimir nodos del mismo nivel, vincule todos los nodos del mismo nivel

> Además, en lugar de imprimir una nueva línea, haga que el último nodo en ese nivel sea NULL

LinkSameLevelNodes vacío (nodo * raíz)

{

// Caso base

if (root == NULL) return;

// Crear una cola vacía para el recorrido de orden de nivel

cola q;

// Coloca la raíz e inicializa la altura

q.push (raíz);

mientras que (1)

{

// nodeCount (tamaño de la cola) indica el número de nodos

// en el nivel actual.

int nodeCount = q.size ();

if (nodeCount == 0)

descanso;

nodo * anterior = NULL;

// Elimina todos los nodos del nivel actual y aplica todos

// nodos del siguiente nivel

while (nodeCount> 0)

{

nodo * nodo = q.front ();

q.pop ();

if (nodo-> left! = NULL)

q.push (nodo-> izquierda);

if (nodo-> right! = NULL)

q.push (nodo-> derecha);

si (anterior)

prev = nodo;

más

{

prev-> siguiente = nodo;

prev = nodo;

}

nodeCount–;

}

prev-> siguiente = NULL;

}

}

Puede usar el recorrido de orden de nivel y luego agregar un enlace a los siguientes nodos en ese mismo nivel

Le daré algo

vacío joinleve ()

{

cola q;

q.push (raíz);

while (q.empty () == falso)

{

Obtenga el tamaño de la cola ahora.

while (size! = 1) // porque tenemos que hacer que el último nodo sea nulo

{

si (q.front () ha dejado al niño) empuje al niño izquierdo a la cola

if (q.front () tiene el hijo derecho) empuje el hijo derecho a la cola

Nodo * t = q.front ();

q.pop ();

t-> right = q.front ();

tamaño- -;

}

// para el último nodo

si (q.front () ha dejado al niño) empuje al niño izquierdo a la cola

if (q.front () tiene el hijo derecho) empuje el hijo derecho a la cola

q.front-> right = NULL;

q.pop ();

}

Explicación detallada con el programa:

1. Usando espacio extra constante.
Conecte nodos al mismo nivel en un árbol binario usando espacio extra constante.

2. Usando la cola
Conecte nodos al mismo nivel en un árbol binario.

Puede encontrar el código de trabajo completo para el mismo aquí en Program para conectar nodos al mismo nivel en el árbol

Conecte nodos al mismo nivel utilizando espacio adicional constante – GeeksforGeeks

No estoy seguro de por qué está buscando vincular nodos al mismo nivel, en caso de que esté haciendo algo en el recorrido, BFS puede ser una solución para atravesar uno por uno sobre nodos del mismo nivel. Para eso puedes usar la cola