116. Rellene el recorrido de la jerarquía del puntero del siguiente nodo derecho de cada nodo

Problema: 116. Rellene el siguiente puntero de nodo derecho de cada nodo

tren de pensamiento

Primero, recorra el árbol binario completo jerárquicamente y registre el número de nodos (el número de capa actual se puede calcular a partir del número de nodo, porque el último nodo de cada capa apunta), empújelo a la pila y luego opere en nextla NULLpila .

método de resolución de problemas

int h = static_cast<int>(log2(cnt ))+1 ; // Según el número de nodo actual, calcular el número de capas donde se encuentra el nodo actual y
int lastNode = pow(2, h) - 1; el número del último nodo en cada capa

  1. Atraviese el árbol binario jerárquicamente, registre el número de nodos y coloque los nodos en la pila en el orden de recorrido jerárquico
  2. El número del último nodo es cnt, visite la pila, calcule el número de capas donde se encuentra el nodo actual y calcule el número del último nodo de la capa actual, si es consistente con el cnt actual, significa que es el último nodo de la capa actual; cur->next = NULL ;de lo contrariocur->next = pre ;
  3. número de nodocnt--

Código

class Solution {
    
    
public:
    stack<Node*> node_stack ;
    int cnt = 0 ; 
    
    Node* connect(Node* root) {
    
    
        // 层次遍历
        // Node *pre = NULL; 
        level_traversal(root) ; 
        Node *pre = NULL; 
        // int  h = static_cast<int>(log2(cnt + 1)); ; //满二叉的树高
        cout<<cnt <<endl ; 
        while(!node_stack.empty()){
    
    
            Node* cur = node_stack.top() ; 
            int  h = static_cast<int>(log2(cnt ))+1 ;  //树高
        
            node_stack.pop() ; 
            int lastNode = pow(2, h) - 1;
            if(cnt == lastNode) {
    
    
            
                cur->next = NULL ;  
            }else{
    
    
                cur->next = pre ; 
                
            }
            pre = cur ; 
            cnt-- ; // 结点编号减去1 
        }
        return root ; 
        
    }
    void level_traversal( Node * root ) {
    
    
        // 层次遍历
        if(!root){
    
    
            return ; 
        }
        queue<Node*> q ;  
        q.push(root) ; 
     
        Node* current = q.front() ; 
        while(!q.empty() ){
    
    
            cnt++ ; 
            current = q.front() ; 
            q.pop() ; 
            node_stack.push(current) ; 

            // cout<<"cur " <<current->val <<endl ; 
            if(current->left ) {
    
    
                q.push(current->left) ; 
            }
            if(current->right) {
    
    
                q.push(current->right) ; 
            }

        }


    }
};

Supongo que te gusta

Origin blog.csdn.net/qq_41661809/article/details/131919952
Recomendado
Clasificación