面試題37:序列化二叉樹
阿新 • • 發佈:2020-08-18
輸入一棵二叉樹,將其序列化為char*,並且支援反序列化為二叉樹。
解題思路
- 先序遍歷二叉樹,序列化
- 同先序遍歷結構,反序列化
程式碼執行結果沒問題,但是未通過所有測試案例。。。
#include <iostream> #include <algorithm> #include <math.h> #include <cstring> #include "ListNode.h" #include "TreeNode.h" #include "Graph.h" using namespace std; #define MAXNUM 100010 #define DRIFT 1001 void Serialize(TreeNode* pRoot, vector<char> &vec){ if(pRoot == nullptr){ vec.push_back('$'); vec.push_back(','); return ; } vec.push_back('0' + pRoot->val); vec.push_back(','); Serialize(pRoot->left, vec); Serialize(pRoot->right, vec); } // 序列化二叉樹(前序遍歷的格式) char* Serialize(TreeNode* root){ vector<char> vecStr; Serialize(root, vecStr); char* str = new char[vecStr.size() + 1]; int i; for(i = 0; i < (int)vecStr.size(); i++) str[i] = vecStr[i]; str[i] = '\0'; return str; } TreeNode* Deserialize(vector<char> &vec){ if(vec.size() == 0) return nullptr; TreeNode* pNode = new TreeNode(vec[vec.size() - 1] - '0'); vec.pop_back(); vec.pop_back(); // 如果讀取的是數字 if(vec[vec.size() - 1] >= '0' && vec[vec.size() - 1] <= '9') pNode->left = Deserialize(vec); else{ pNode->left = nullptr; vec.pop_back(); vec.pop_back(); } // 如果讀取的是數字 if(vec[vec.size() - 1] >= '0' && vec[vec.size() - 1] <= '9') pNode->right = Deserialize(vec); else{ pNode->right = nullptr; vec.pop_back(); vec.pop_back(); } return pNode; } // 根據前序遍歷的序列化結果,重建二叉樹 TreeNode* Deserialize(char *str){ // 根據前序遍歷重建 vector<char> vec; string s = str; for(int i = s.length() - 1, j = 0; i >= 0; i--) vec.push_back(s[i]); return Deserialize(vec); } int main() { TreeNode* pNode1 = CreateBinaryTreeNode(1); TreeNode* pNode2 = CreateBinaryTreeNode(2); TreeNode* pNode3 = CreateBinaryTreeNode(3); TreeNode* pNode4 = CreateBinaryTreeNode(4); TreeNode* pNode5 = CreateBinaryTreeNode(5); TreeNode* pNode6 = CreateBinaryTreeNode(6); ConnectTreeNodes(pNode2, pNode4, nullptr); ConnectTreeNodes(pNode3, pNode5, pNode6); ConnectTreeNodes(pNode1, pNode2, pNode3); // 如果寫為char str[100]返回的話,會報錯,不能返回區域性變數 char* str = Serialize(pNode1); cout<<str<<endl; PrintTree(Deserialize(str)); delete str; return 0; }