LeetCode 116: el árbol binario llena el siguiente puntero de nodo derecho de cada nodo

El problema es el siguiente:
dado un árbol binario perfecto, todos sus nodos hoja están al mismo nivel y cada nodo padre tiene dos nodos hijos. El árbol binario se define de la siguiente manera:

struct Node { int val; Node * left; Node * right; Node * next; } Llene cada uno de sus siguientes punteros para que este puntero apunte a su siguiente nodo derecho. Si no se puede encontrar el siguiente nodo de la derecha, el siguiente puntero se establece en NULL.





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

Inserte la descripción de la imagen aquí

输入:{
    
    "$id":"1","left":{
    
    "$id":"2","left":{
    
    "$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{
    
    "$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{
    
    "$id":"5","left":{
    
    "$id":"6","left":null,"next":null,"right":null,"val":6},"next":null,"right":{
    
    "$id":"7","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}

输出:{
    
    "$id":"1","left":{
    
    "$id":"2","left":{
    
    "$id":"3","left":null,"next":{
    
    "$id":"4","left":null,"next":{
    
    "$id":"5","left":null,"next":{
    
    "$id":"6","left":null,"next":null,"right":null,"val":7},"right":null,"val":6},"right":null,"val":5},"right":null,"val":4},"next":{
    
    "$id":"7","left":{
    
    "$ref":"5"},"next":null,"right":{
    
    "$ref":"6"},"val":3},"right":{
    
    "$ref":"4"},"val":2},"next":null,"right":{
    
    "$ref":"7"},"val":1}

解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。

Sugerencia:
solo puede usar espacio adicional de nivel 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.

Para este tema, podemos pensar fácilmente en la siguiente situación:
1. Realice la misma operación para cada nodo.

Node connect(Node root) {
    
    
    if (root == null || root.left == null) {
    
    
        return root;
    }

    root.left.next = root.right;

    connect(root.left);
    connect(root.right);

    return root;
}

Luego está el siguiente resultado:
Inserte la descripción de la imagen aquí
¿Se encontró alguna diferencia? Sí, los extremos izquierdo y derecho de los diferentes nodos principales no están conectados entre sí. Dado que es imposible operar en un nodo, considere operar en dos nodos:

/*
// 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(root==NULL) return NULL;
        connectTwoNode(root->left,root->right); //连接两个相邻的结点
        return root;
    }

    void connectTwoNode(Node *a,Node *b){
    
    
        if(a==NULL||b==NULL) return;

        a->next=b;
        /*将相同父节点的两点连接*/
        connectTwoNode(a->left,a->right);
        connectTwoNode(b->left,b->right);
        /*不同父节点的两点连接*/
        connectTwoNode(a->right,b->left);
    }

};

Esto se hace. Recuerde tratar con el árbol binario. Es necesario averiguar si la misma acción se puede realizar en cada combinación de manera consistente. Esta combinación también puede ser un solo nodo.

  • [Cuenta pública de referencia: labuladong]

Supongo que te gusta

Origin blog.csdn.net/weixin_45146520/article/details/109056263
Recomendado
Clasificación