1. 程式人生 > 實用技巧 >449. 序列化和反序列化二叉搜尋樹

449. 序列化和反序列化二叉搜尋樹

序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同一個或另一個計算機環境中重建。

設計一個演算法來序列化和反序列化二叉搜尋樹。 對序列化/反序列化演算法的工作方式沒有限制。 您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字串反序列化為最初的二叉搜尋樹。

編碼的字串應儘可能緊湊。

注意:不要使用類成員/全域性/靜態變數來儲存狀態。 你的序列化和反序列化演算法應該是無狀態的。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 
*/ class Codec { public: //要充分利用二叉查詢樹的特性:如果是普通的二叉樹,序列化後再反序列化需要用一個特殊符號,例如#來表示之前節點為null的 //這樣反序列化才能得到之前的 //二叉查詢樹不需要,可以直接利用一個特性:根節點值大於左子樹,小於右子樹。即可判斷下一個反序列化的節點是在根節點左子樹還是右子樹 //借鑑leetcode 解,利用4位元組char來序列化int可省下較多空間;若使用string,比如 //123456 char buf[4] 32位即可保證123456不丟資訊,而string "123456"需要6個位元組
// Encodes a tree to a single string. string serialize(TreeNode* root) { string res; preorder(root,res); return res; } void preorder(TreeNode* root,string& res){ if(root == nullptr){ return ; } char buf[4]; memcpy(buf,
&(root->val),sizeof(int)); for(int i=0;i<4;i++) res.push_back(buf[i]); preorder(root->left,res); preorder(root->right,res); } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { TreeNode* node; int pos = 0; return depreorder(pos,INT_MIN,INT_MAX,data); } TreeNode* depreorder(int& pos,int min,int max,string& data){ if(pos*4 >= data.size()) return nullptr; int value; memcpy(&value,&data[pos*4],sizeof(int)); if(value < min || value > max) return nullptr; TreeNode* root = new TreeNode(value); pos+=1; root->left = depreorder(pos,min,value,data); root->right = depreorder(pos,value,max,data); return root; } }; // Your Codec object will be instantiated and called as such: // Codec codec; // codec.deserialize(codec.serialize(root));