[Leetcode] 117. Completar los punteros siguientes a la derecha en cada nodo II (Completar los punteros siguientes a la derecha en cada nodo II)


Descripción del Título

[Leetcode] 117. Completar los punteros siguientes a la derecha en cada nodo II (Completar los punteros siguientes a la derecha en cada nodo II)

Dado un árbol binario

struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

Llene cada uno de sus siguientes punteros para que este puntero apunte al siguiente nodo derecho. Si no se puede encontrar el siguiente nodo derecho, el siguiente puntero se establece en NULL.

En el estado inicial, todos los punteros siguientes se establecen en NULL.

Avanzado:

  • Solo puede utilizar espacio extra constante.
  • El uso de la recursividad para resolver el problema también cumple con los requisitos El espacio de pila ocupado por el programa recursivo en este problema no se cuenta como complejidad de espacio adicional.

Ejemplo:

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。

rápido:

  • El número de nodos en el árbol es inferior a 6000
  • -100 <= nodo.val <= 100

Primera respuesta

La idea de
esta pregunta es obviamente más fácil de resolver usando un recorrido jerárquico, pero generalmente cuando realizamos un recorrido jerárquico, necesitamos usar una cola para almacenar los nodos de la siguiente capa cada vez que atravesamos una capa, lo que obviamente no es adecuado para la siguiente ronda de recorrido. Requisitos de pedido 你只能使用常量级额外空间. Entonces, ¿cómo atravesamos la jerarquía en el espacio extra constante?
Esta pregunta es bastante especial: cada nodo proporciona los siguientes miembros y la capa se puede atravesar desde el nodo más a la izquierda cada vez a lo largo del siguiente.
Pero el siguiente está vacío por defecto, ¿cómo obtenemos el siguiente conjunto? Se puede utilizar un enfoque de arriba hacia abajo. Para el nodo raíz, podemos conectar fácilmente los nodos de la siguiente capa. Una vez realizadas las conexiones, podemos atravesar los nodos de la siguiente capa y luego conectar los nodos de la capa inferior ... y así sucesivamente.
Un detalle aquí es que el nodo inicial de la siguiente capa es el nodo más a la izquierda de la siguiente capa. Consulte el código para obtener más detalles.

caso de prueba:
[-1, -7,9, nulo, nulo, -1, -7, nulo, 8, -9]
[1,2,3,4,5, nulo, 7]
[1,2,3 , 4,5, nulo, 6,7, nulo, nulo, nulo, nulo, 8]

Código:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
    
    
public:
    Node* connect(Node* root) {
    
    
        if(nullptr == root)
            return root;

        Node* pRoot = root;
        while(nullptr != pRoot){
    
    
        	// 拿到这一层的起始结点
            Node* pNode = pRoot;
            Node* pPre = nullptr;
            // 通过next遍历这一层
            // 将这一层的孩子的next都连接起来
            while(nullptr != pNode){
    
    
               if(nullptr != pNode->left){
    
    
                    if(nullptr != pPre)
                        pPre->next = pNode->left;
                    pPre = pNode->left;
                }
                if(nullptr != pNode->right){
    
    
                    if(nullptr != pPre)
                        pPre->next = pNode->right;
                    pPre = pNode->right;
                }
                pNode = pNode->next;
                
               }
            // 计算下一层起始结点pRoot
            // 下一个pRoot应该是下一层最靠左的结点
            while(nullptr != pRoot && nullptr == pRoot->left && 
                    nullptr == pRoot->right){
    
    
                pRoot = pRoot->next;
            }
            if(nullptr != pRoot)
                pRoot = pRoot->left == nullptr ? pRoot->right : pRoot->left;
        }

        return root;
    }
};

resultado:

Captura de pantalla

Segunda respuesta

Ideas
Después de leer la solución oficial, el trabajo de encontrar el nodo inicial de la siguiente capa se puede colocar en el proceso de conectar a los niños.

Código:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/
class Solution {
    
    
public:
    Node* connect(Node* root) {
    
    
        if(nullptr == root)
            return root;

        Node* pRoot = root;
        while(nullptr != pRoot){
    
    
        	// 拿到这一层的起始结点
            Node* pNode = pRoot;
            Node* pPre = nullptr;
            pRoot = nullptr;// 置空,由下面找孩子时得到下一层最靠左的结点
            // 通过next遍历这一层
            // 将这一层的孩子的next都连接起来
            while(nullptr != pNode){
    
    
               if(nullptr != pNode->left){
    
    
                    if(nullptr != pPre)
                        pPre->next = pNode->left;
                    else
                        pRoot = pNode->left;
                    pPre = pNode->left;
                }
                if(nullptr != pNode->right){
    
    
                    if(nullptr != pPre)
                        pPre->next = pNode->right;
                    else
                        pRoot = pNode->right;
                    pPre = pNode->right;
                }
                pNode = pNode->next;
                
               }
            // 下一个pRoot应该是下一层最靠左的结点
            // while(nullptr != pRoot && nullptr == pRoot->left && 
            //         nullptr == pRoot->right){
    
    
            //     pRoot = pRoot->next;
            // }
            // if(nullptr != pRoot)
            //     pRoot = pRoot->left == nullptr ? pRoot->right : pRoot->left;
        }

        return root;
    }
};

resultado:

Inserte la descripción de la imagen aquí

Enlaces relacionados / de referencia

Supongo que te gusta

Origin blog.csdn.net/a435262767/article/details/105169575
Recomendado
Clasificación