각 노드에 (data, left, right, next) 필드가 있는 완전한 이진 트리가 있다고 가정합니다. 왼쪽은 왼쪽 하위 트리를 가리키고 오른쪽은 오른쪽 하위 트리를 가리키고 다음 포인터는 다음 노드를 가리킵니다. . 오른쪽에 노드가 없으면 null이 됩니다. 따라서 처음에는 다음 포인터 각각이 null로 설정되어 있으므로 링크를 만들어야 합니다. 트리가 첫 번째 노드와 같다고 가정하면 다음 노드로 변환됩니다 -
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- pre :=root, nextPre :=null 및 prev :=null로 설정
- pre가 null이 아닌 동안
- pre가 null이 아닌 동안
- pre의 왼쪽이 null이 아닌 경우
- set next of prev :=pre의 왼쪽, prev가 null이 아닐 때, 그렇지 않으면 nextPre :=pre의 왼쪽
- prev :=pre의 왼쪽
- pre의 권한이 null이 아닌 경우
- prev의 다음 설정 :=prev가 null이 아닐 때 pre의 오른쪽, 그렇지 않으면 nextPre :=pre의 오른쪽
- prev :=pre의 오른쪽
- pre의 왼쪽이 null이 아닌 경우
- pre :=nextPre
- nextPre를 null로 설정하고 prev를 null로 설정
- pre가 null이 아닌 동안
- null 반환
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h> #include <stack> using namespace std; class Node { public: int val; Node* left; Node* right; Node* next; Node() {} Node(int _val, Node* _left, Node* _right) { val = _val; left = _left; right = _right; next = NULL; } }; class Solution { public: Node* connect(Node* root) { Node* pre = root; Node* nextPre = NULL; Node* prev = NULL; while(pre){ while(pre){ //cout << pre->val << endl; if(pre->left){ if(prev){ prev->next = pre->left; }else{ nextPre = pre->left; } prev = pre->left; } if(pre->right){ if(prev){ prev->next = pre->right; }else{ nextPre = pre->right; } prev = pre->right; } pre = pre->next; } //cout << "*" << endl; pre = nextPre; nextPre = NULL; prev = NULL; } return root; } }; void printTree(Node* root) { cout << "["; if (root == NULL) return; queue<Node*> q; Node *curr; q.push(root); q.push(NULL); while (q.size() > 1) { curr = q.front(); q.pop(); if (curr == NULL){ q.push(NULL); } else { // if(curr->next) // q.push(curr->next); if(curr->left) q.push(curr->left); if(curr->right) q.push(curr->right); if(curr->val == 0){ cout << "null" << ", "; }else{ cout << curr->val << ", "; if (curr->next == NULL) cout<<"#, "; } } } cout << "]"<<endl; } int main() { Node* root; Node nodeFour(4, NULL, NULL); Node nodeFive(5, NULL, NULL ); Node nodeSeven(7, NULL, NULL); Node nodeSix(6, NULL, NULL); Node nodeTwo(2,&nodeFour,&nodeFive); Node nodeThree(3,&nodeSix,&nodeSeven); Node nodeOne(1,&nodeTwo,&nodeThree); root = &nodeOne; Solution ob; root = ob.connect(root); printTree(root); }
입력
[1,2,3,4,5,6,7] Node* root; Node nodeFour(4, NULL, NULL); Node nodeFive(5, NULL, NULL ); Node nodeSeven(7, NULL, NULL); Node nodeSix(6, NULL, NULL); Node nodeTwo(2,&nodeFour,&nodeFive); Node nodeThree(3,&nodeSix,&nodeSeven); Node nodeOne(1,&nodeTwo,&nodeThree); root = &nodeOne; Solution ob; root = ob.connect(root);
출력
[1, #, 2, 3, #, 4, 5, 6, 7, #, ]