1. 程式人生 > >61、劍指offer--序列化二叉樹

61、劍指offer--序列化二叉樹

struct 1.7 ont != 兩個 劍指offer roo line text

題目描述 請實現兩個函數,分別用來序列化和反序列化二叉樹 解題思路:序列化的時候,遇到無子結點,則填#來占位;對於反序列化時,每次遇到#返回空
 1 /*
 2 struct TreeNode {
 3     int val;
 4     struct TreeNode *left;
 5     struct TreeNode *right;
 6     TreeNode(int x) :
 7             val(x), left(NULL), right(NULL) {
 8     }
 9 };
10 */
11 class Solution {
12 public
: 13 void Serialize(TreeNode *root, string &str) 14 { 15 if(root == NULL) 16 { 17 str += #;//用#代表null 18 return;//返回上一層 19 } 20 else 21 { 22 string r = to_string(root->val);//值轉字符串 23 str += r;//字符串拼接 24 str +=
,;//數字後用,進行節點分隔 25 Serialize(root->left,str); 26 Serialize(root->right,str); 27 } 28 } 29 char* Serialize(TreeNode *root) { 30 if(root == NULL) 31 return NULL; 32 string str; 33 Serialize(root, str); 34 //字符串轉char * 35
char *ret = new char[str.length()+1]; 36 for(int i=0;i<str.length();i++) 37 { 38 ret[i] = str[i]; 39 } 40 ret[str.length()] = \0; 41 return ret; 42 } 43 TreeNode *deserialize(char **str) 44 { 45 if(**str == #)//空的時候返回 46 { 47 ++(*str); 48 return NULL; 49 } 50 int num = 0; 51 while(**str != \0 && **str != ,) 52 { 53 num = num*10 + ((**str) - 0); //求出每個節點的值 54 ++(*str); 55 } 56 TreeNode *root = new TreeNode(num); 57 if(**str == \0) 58 return root; 59 else 60 (*str)++;//跨過‘,‘ 61 root->left = deserialize(str); 62 root->right = deserialize(str); 63 return root; 64 } 65 TreeNode* Deserialize(char *str) { 66 if(str == NULL) 67 return NULL; 68 TreeNode *res = deserialize(&str); 69 return res; 70 } 71 };

61、劍指offer--序列化二叉樹