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).
- ¿Cómo deberíamos hacer un seguimiento de la mediana de una matriz en expansión?
- ¿Por qué mi solución C ++ al problema SPOJ.com - Problema DIVSUM2 muestra un error?
- ¿Por qué el tipo Bubble se llama Bobble?
- ¿Qué es un algoritmo que calculará si se puede pagar la cantidad [math] n [/ math] si tenemos un suministro ilimitado de monedas para cada valor entre [math] a [/ math] y [math] b [/ math] ?
- Cómo capturar información de color de un anime