Minecraft Java版22w13a釋出/更新內容
阿新 • • 發佈:2022-04-04
449. 序列化和反序列化二叉搜尋樹
序列化是將資料結構或物件轉換為一系列位的過程,以便它可以儲存在檔案或記憶體緩衝區中,或通過網路連線鏈路傳輸,以便稍後在同一個或另一個計算機環境中重建。
設計一個演算法來序列化和反序列化 二叉搜尋樹 。 對序列化/反序列化演算法的工作方式沒有限制。 您只需確保二叉搜尋樹可以序列化為字串,並且可以將該字串反序列化為最初的二叉搜尋樹。
編碼的字串應儘可能緊湊。
示例 1:
輸入:root = [2,1,3]
輸出:[2,1,3]
示例 2:
輸入:root = []
輸出:[]
提示:
- 樹中節點數範圍是
[0, 104]
0 <= Node.val <= 104
- 題目資料 保證 輸入的樹是一棵二叉搜尋樹。
思路:
本題類似於二叉樹的序列化與反序列化,對於BST來說,他的前序遍歷第一個數是根節點。在序列化時,利用分隔符將所有資料都存入string中。在反序列化時,先將資料分開來存進容器裡,在去在[min,max]閉區間中去構造BST,左節點都比根節點小,右節點都比根節點大
class Codec { public: string a=""; // Encodes a tree to a single string. string serialize(TreeNode* root) { //前序遍歷 if(root==NULL)return a; //用,分隔開每個數 a+=to_string(root->val)+','; serialize(root->left); serialize(root->right); return a; } // Decodes your encoded data to tree. TreeNode* deserialize(string data) { //cout<<data; //反序列化 //先將每個節點的數取出來 vector<string>nodes; int n=data.size(); string s=""; for(int i=0;i<n;i++){ //每遇到, 就記入一個數據 if(data[i]==','){ nodes.push_back(s); s=""; }else{ s+=data[i]; //cout<<s<<endl; } } return deserialize(nodes,INT_MIN,INT_MAX); } //利用nodes容器,在[min,max]中構造一個BST TreeNode* deserialize(vector<string>&nodes,int min,int max){ if(nodes.empty())return NULL; //利用前序遍歷進行反序列化 //容器的第一個元素就是根節點 int rootVal=stoi(nodes.front()); if (rootVal > max || rootVal < min) { // 超過閉區間 [min, max],則返回空指標 return NULL; } TreeNode* root=new TreeNode(rootVal); nodes.erase(nodes.begin()); //遞迴 構造左右子樹 BST左子樹小於根節點 右子樹大於根節點 root->left=deserialize(nodes,min,rootVal); root->right=deserialize(nodes,rootVal,max); return root; } };
空間複雜度和時間複雜度都太高,只超過了5%。:(