สมมติว่าเรามีไบนารีทรี โดยที่แต่ละโหนดมีฟิลด์ต่อไปนี้ (ข้อมูล ซ้าย ขวา ถัดไป) ด้านซ้ายจะชี้ไปที่ทรีย่อยด้านซ้าย ด้านขวาจะชี้ไปที่ทรีย่อยด้านขวา และตัวชี้ถัดไปจะชี้ไปที่โหนดถัดไป หากไม่มีโหนดทางด้านขวามือ จะเป็นโมฆะ ดังนั้นในตอนแรก ตัวชี้ถัดไปแต่ละตัวจะถูกตั้งค่าเป็น null เราจะต้องสร้างลิงก์ สมมติว่าต้นไม้เป็นเหมือนต้นแรก มันจะถูกแปลงเป็นโหนดถัดไป -


เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- set pre :=root, nextPre :=null and prev :=null
- ในขณะที่ pre ไม่เป็นค่าว่าง
- ในขณะที่ pre ไม่เป็นค่าว่าง
- ถ้าเหลือของพรีไม่เป็นค่าว่าง
- set next of prev :=left of pre เมื่อ prev ไม่เป็นค่าว่าง มิฉะนั้น nextPre :=left of pre
- prev :=left of pre
- ถ้าสิทธิ์ของพรีไม่เป็นโมฆะ
- set next of prev :=right of pre เมื่อ prev ไม่เป็นค่าว่าง มิฉะนั้น nextPre :=right of pre
- prev :=right of pre
- ถ้าเหลือของพรีไม่เป็นค่าว่าง
- ก่อน :=ถัดไป
- ตั้งค่า nextPre เป็น null และนำหน้าเป็น null
- ในขณะที่ pre ไม่เป็นค่าว่าง
- คืนค่า null
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
#include <stack>
using namespace std;
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): 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);
Node nodeFive(5);
Node nodeSeven(7);
Node nodeTwo(2,&nodeFour,&nodeFive);
Node nodeThree(3,NULL,&nodeSeven);
Node nodeOne(1,&nodeTwo,&nodeThree);
root = &nodeOne;
Solution ob;
root = ob.connect(root);
printTree(root);
} อินพุต
[1,2,3,4,5,null,7] Node* root; Node nodeFour(4); Node nodeFive(5); Node nodeSeven(7); Node nodeTwo(2,&nodeFour,&nodeFive); Node nodeThree(3,NULL,&nodeSeven); Node nodeOne(1,&nodeTwo,&nodeThree); root = &nodeOne;
ผลลัพธ์
[1, #, 2, 3, #, 4, 5, 7, #, ]