สมมติว่าเรามีไบนารีทรีที่สมบูรณ์ โดยที่แต่ละโหนดมีฟิลด์ต่อไปนี้ (ข้อมูล ซ้าย ขวา ถัดไป) ด้านซ้ายจะชี้ไปที่ทรีย่อยด้านซ้าย ด้านขวาจะชี้ไปที่ทรีย่อยด้านขวา และตัวชี้ถัดไปจะชี้ไปที่โหนดถัดไป . หากไม่มีโหนดทางด้านขวามือ จะเป็นโมฆะ ดังนั้นในตอนแรก ตัวชี้ถัดไปแต่ละตัวจะถูกตั้งค่าเป็น 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
- ถ้าเหลือของพรีไม่เป็นค่าว่าง
- pre :=nextPre
- ตั้งค่า 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() {} 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, #, ]