สมมติว่าเรามีไบนารีทรีหนึ่งต้นและเราต้องทำให้เป็นอนุกรมและดีซีเรียลไลซ์พวกมัน ดังที่เราทราบดีว่าการทำให้เป็นอนุกรมเป็นกระบวนการของการแปลงโครงสร้างข้อมูลหรืออ็อบเจ็กต์เป็นลำดับของบิต เพื่อให้เราสามารถเก็บไว้ในไฟล์หรือบัฟเฟอร์หน่วยความจำ และสามารถสร้างใหม่ได้ในภายหลังในสภาพแวดล้อมเดียวกันหรือคอมพิวเตอร์อื่น
ที่นี่เราต้องสร้างอัลกอริธึมเพื่อทำให้เป็นอนุกรมและดีซีเรียลไลซ์ไบนารีทรี ต้นไม้ไบนารีเป็นต้นไม้ที่รูทแล้ว โดยที่แต่ละโหนดมีลูกไม่เกิน 2 ลูก
ดังนั้นหากอินพุตเป็นแบบ
จากนั้นผลลัพธ์จะเป็น Serialize − 1 2 3 4 5 N N N N N N ต้นไม้ดีซีเรียลไลซ์:4 2 5 1 3
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน serialize() ซึ่งจะทำการรูท
-
ret :=สตริงว่าง
-
กำหนดหนึ่งคิว q
-
แทรกรูทลงใน q
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่า) ทำ -
-
curr =องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
หากไม่มีสกุลเงิน −
-
ret :=ret เชื่อม "N"
-
ret :=ret เชื่อมช่องว่าง
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
ret :=ret + มูลค่าของสกุลเงิน
-
ret :=ret + ช่องว่าง
-
ด้านซ้ายของเคอร์เซอร์ที่ส่วนท้ายของ q
-
ด้านขวาของสกุลเงินที่ส่วนท้ายของ q
-
-
รีเทิร์น
-
กำหนดฟังก์ชัน deserialize() ซึ่งจะใช้ข้อมูล
-
ถ้า data[0] เหมือนกับ 'N' แล้ว −
-
คืนค่า NULL
-
-
temp :=สตริงว่าง
-
กำหนดอาร์เรย์ v
-
สำหรับการเริ่มต้น i :=0 เมื่อ i − ขนาดของข้อมูล ให้อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
-
ถ้า data[i] เหมือนกับช่องว่าง ดังนั้น −
-
ใส่ temp ที่ท้าย v
-
temp :=สตริงว่าง
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
temp :=temp + data[i]
-
-
newRoot =โหนดใหม่พร้อม v[0]
-
กำหนดหนึ่งคิว q
-
แทรก newRoot ลงใน q
-
ผม :=1
-
ในขณะที่ (ไม่ q ว่างเปล่าและฉัน <ขนาดของ v) ทำ −
-
parent =องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
ถ้า v[i] ไม่เท่ากับ "N" แล้ว −
-
left of parent :=โหนดใหม่พร้อม v[i]
-
แทรกด้านซ้ายของ parent ลงใน q
-
-
(เพิ่ม i ขึ้น 1)
-
ถ้า v[i] ไม่เท่ากับ "N" แล้ว −
-
ด้านขวาของพาเรนต์ :=โหนดใหม่พร้อม v[i]
-
แทรกด้านขวาของ parent ลงใน q
-
-
(เพิ่ม i ขึ้น 1)
-
-
ส่งคืนรูทใหม่
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h> using namespace std; class TreeNode { public: int val; TreeNode *left, *right; TreeNode(int data) { val = data; left = NULL; right = NULL; } }; void insert(TreeNode **root, int val) { queue<TreeNode *> q; q.push(*root); while (q.size()) { TreeNode *temp = q.front(); q.pop(); if (!temp->left) { if (val != NULL) temp->left = new TreeNode(val); else temp->left = new TreeNode(0); return; } else { q.push(temp->left); } if (!temp->right) { if (val != NULL) temp->right = new TreeNode(val); else temp->right = new TreeNode(0); return; } else { q.push(temp->right); } } } TreeNode *make_tree(vector<int> v) { TreeNode *root = new TreeNode(v[0]); for (int i = 1; i < v.size(); i++) { insert(&root, v[i]); } return root; } void inord(TreeNode *root) { if (root != NULL) { inord(root->left); cout << root->val << " "; inord(root->right); } } class Codec { public: string serialize(TreeNode *root) { string ret = ""; queue<TreeNode *> q; q.push(root); while (!q.empty()) { TreeNode *curr = q.front(); q.pop(); if (!curr) { ret += "N"; ret += " "; continue; } ret += to_string(curr->val); ret += " "; q.push(curr->left); q.push(curr->right); } return ret; } TreeNode *deserialize(string data) { if (data[0] == 'N') return NULL; string temp = ""; vector<string> v; for (int i = 0; i < data.size(); i++) { if (data[i] == ' ') { v.push_back(temp); temp = ""; continue; } temp += data[i]; } TreeNode *newRoot = new TreeNode(stoi(v[0])); queue<TreeNode *> q; q.push(newRoot); int i = 1; while (!q.empty() && i < v.size()) { TreeNode *parent = q.front(); q.pop(); if (v[i] != "N") { parent->left = new TreeNode(stoi(v[i])); q.push(parent->left); } i++; if (v[i] != "N") { parent->right = new TreeNode(stoi(v[i])); q.push(parent->right); } i++; } return newRoot; } }; main() { Codec ob; vector<int> v = {1,2,3,4,5}; TreeNode *root = make_tree(v); cout << "Given Tree: "; inord(root); cout << endl; string ser = ob.serialize(root); cout << "Serialize: " << ser << endl; TreeNode *deser = ob.deserialize(ser); cout << "Deserialized Tree: "; inord(root); }
อินพุต
1,2,3,4,5
ผลลัพธ์
Given Tree: 4 2 5 1 3 Serialize: 1 2 3 4 5 N N N N N N Deserialized Tree: 4 2 5 1 3