สมมติว่าเรามีต้นไม้ N-ary หนึ่งต้น และเราต้องทำให้เป็นอนุกรมและดีซีเรียลไลซ์ต้นไม้เหล่านั้น ดังที่เราทราบดีว่าการทำให้เป็นอนุกรมเป็นกระบวนการของการแปลงโครงสร้างข้อมูลหรืออ็อบเจ็กต์เป็นลำดับของบิต เพื่อให้เราสามารถเก็บไว้ในไฟล์หรือบัฟเฟอร์หน่วยความจำ และสามารถสร้างใหม่ได้ในภายหลังในสภาพแวดล้อมเดียวกันหรือคอมพิวเตอร์อื่น
ที่นี่เราต้องสร้างอัลกอริทึมเพื่อทำให้เป็นอนุกรมและดีซีเรียลไลซ์ทรี N-ary ต้นไม้ N-ary เป็นต้นไม้ที่รูทแล้ว ซึ่งแต่ละโหนดมีลูกไม่เกิน N
ดังนั้นหากอินพุตเป็นแบบ

จากนั้นผลลัพธ์จะเป็น Serialize:1 #3 2 4 #5 6 ##### และ Deserialized Tree:1[3[5, 6, ], 2, 4, ]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน createVector() ซึ่งจะใช้เวลา s
-
กำหนดอาร์เรย์ 2D ret หนึ่งรายการ
-
กำหนดอาร์เรย์ tempv
-
temp :=สตริงว่าง
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
ถ้า s[i] ไม่เท่ากับช่องว่าง และ s[i] ไม่เท่ากับ '#' ดังนั้น −
-
temp :=temp + s[i]
-
-
มิฉะนั้นเมื่อ s[i] เหมือนกับสตริงว่าง ดังนั้น −
-
ใส่จำนวนเต็ม temp s ที่ส่วนท้ายของ tempv
-
temp :=สตริงว่าง
-
-
มิฉะนั้นเมื่อ s[i] เหมือนกับ '#' ดังนั้น −
-
ใส่ tempv ที่ส่วนท้ายของ ret
-
temp :=สตริงว่าง
-
อุณหภูมิที่ชัดเจน
-
-
-
ในขณะที่ (ไม่ ret ว่างเปล่าและองค์ประกอบสุดท้ายของ ret เหมือนกับ 0) ทำ -
-
ลบองค์ประกอบสุดท้ายออกจาก ret
-
-
รีเทิร์น
-
กำหนดฟังก์ชัน serialize() ซึ่งจะทำการรูท
-
ret :=สตริงว่าง
-
ถ้าไม่ใช่รูทก็ไม่ใช่ศูนย์ ดังนั้น −
-
รีเทิร์น
-
-
กำหนดหนึ่งคิว q
-
แทรกรูทลงใน q
-
rret :=ret concatenate val ของรูท
-
ret :=ret ต่อช่องว่าง
-
ret :=ret concatenate "#"
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่า) ทำ -
-
curr =องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
สำหรับการเริ่มต้น i :=0 เมื่อฉัน <ขนาดของอาร์เรย์ลูกของ curr ให้อัปเดต (เพิ่ม i โดย 1) ทำ -
-
ถ้าลูก[i] ของเคอร์ แล้ว −
-
ret :=ret concatenate children[i] ของสกุลเงิน
-
ใส่ลูก[i] ของcurr ลงใน q
-
-
ret :=ret + สตริงว่าง
-
-
ret :=ret concatenate "#"
-
-
รีเทิร์น
-
กำหนดฟังก์ชัน deserialize() ซึ่งจะใช้ข้อมูล
-
ถ้าขนาดของข้อมูลเท่ากับ 0 แล้ว −
-
คืนค่า null
-
-
กำหนดอาร์เรย์ 2 มิติ v :=createVector(data)
-
ret :=โหนดใหม่ที่มีค่า v[0, 0]
-
กำหนดหนึ่งคิว q
-
แทรก ret ลงใน q
-
ผม :=1
-
ในขณะที่ (ไม่ใช่ q ว่างเปล่าและฉัน − ขนาดของ v) ทำ −
-
curr =องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
สำหรับการเริ่มต้น j :=0 เมื่อ j − ขนาดของ v[i] ให้อัปเดต (เพิ่ม j ทีละ 1) ให้ทำ −
-
โหนด :=v[i, j]
-
temp =โหนดใหม่พร้อมโหนดค่า
-
ใส่ temp ที่ส่วนท้ายของลูกของ curr
-
ใส่อุณหภูมิลงใน q
-
-
(เพิ่ม i ขึ้น 1)
-
-
รีเทิร์น
ตัวอย่าง
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
class Node {
public:
int val;
vector<Node*> children;
Node() {}
Node(int _val) {
val = _val;
}
Node(int _val, vector<Node*> _children) {
val = _val;
children = _children;
}
};
string n_ary_to_str(Node *root){
string ret = "";
if(root){
ret = ret + to_string(root->val);
if(root->children.size() > 0){
ret += "[";
for(Node* child : root->children){
ret += n_ary_to_str(child) + ", ";
}
ret += "]";
}
}
return ret;
}
class Codec {
public:
vector<vector<int>>createVector(string s) {
vector<vector<int>> ret;
vector<int> tempv;
string temp = "";
for (int i = 0; i < s.size(); i++) {
if (s[i] != ' ' && s[i] != '#') {
temp += s[i];
}
else if (s[i] == ' ') {
tempv.push_back(stoi(temp));
temp = "";
}
else if (s[i] == '#') {
ret.push_back(tempv);
temp = "";
tempv.clear();
}
}
while (!ret.empty() && ret.back().size() == 0)
ret.pop_back();
return ret;
}
string serialize(Node *root) {
string ret = "";
if (!root)
return ret;
queue<Node *> q;
q.push(root);
ret += to_string(root->val);
ret += " ";
ret += "#";
while (!q.empty()) {
Node *curr = q.front();
q.pop();
for (int i = 0; i < curr->children.size(); i++) {
if (curr->children[i]) {
ret += to_string(curr->children[i]->val);
q.push(curr->children[i]);
}
ret += " ";
}
ret += "#";
}
return ret;
}
Node *deserialize(string data) {
Node *ret;
if (data.size() == 0)
return NULL;
vector<vector<int>> v = createVector(data);
ret = new Node(v[0][0]);
queue<Node *> q;
q.push(ret);
int i = 1;
while (!q.empty() && i < v.size()) {
Node *curr = q.front();
q.pop();
for (int j = 0; j < v[i].size(); j++) {
int node = v[i][j];
Node *temp = new Node(node);
curr->children.push_back(temp);
q.push(temp);
}
i++;
}
return ret;
}
};
main() {
Codec ob;
Node n5(5), n6(6);
Node n3(3); n3.children.push_back(&n5); n3.children.push_back(&n6);
Node n2(2), n4(4);
Node n1(1); n1.children.push_back(&n3); n1.children.push_back(&n2);
n1.children.push_back(&n4);
cout << "Given Tree: " << n_ary_to_str(&n1) << endl;
string ser = ob.serialize(&n1);
cout << "Serialize: " << ser << endl;
Node *deser = ob.deserialize(ser);
cout << "Deserialized Tree: " << n_ary_to_str(deser);
} อินพุต
Node n5(5), n6(6); Node n3(3); n3.children.push_back(&n5); n3.children.push_back(&n6); Node n2(2), n4(4); Node n1(1); n1.children.push_back(&n3); n1.children.push_back(&n2); n1.children.push_back(&n4);
ผลลัพธ์
Given Tree: 1[3[5, 6, ], 2, 4, ] Serialize: 1 #3 2 4 #5 6 ##### Deserialized Tree: 1[3[5, 6, ], 2, 4, ]