Problema: 116. Rellene el siguiente puntero de nodo derecho de cada nodo
Directorio de artículos
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
next
laNULL
pila .
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
- 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
- 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 ;
- número de nodo
cnt--
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) ;
}
}
}
};