序列化二叉树
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
思路:以前序遍历为基础,考虑NULL指针。将NULL指针记为$。注意字符串的处理,将数字转化为字符串,将字符串转化为数字。
1 class Solution { 2 public: 3 void WriteToStr(int val, char *str, int &i) 4 { 5 char tmp[20]; 6 int j=0; 7 while(val) 8 { 9 int num=val%10; 10 val=val/10; 11 tmp[j++]=(char)(num-0+'0'); 12 } 13 while(j--) 14 { 15 str[i++]=tmp[j]; 16 } 17 str[i++]=','; 18 } 19 void MySerialize(TreeNode *root, char *str, int &i) 20 { 21 if(root==NULL) 22 { 23 str[i++]='$'; 24 str[i++]=','; 25 }else{ 26 WriteToStr(root->val, str, i);//将数字转化为字符串 27 MySerialize(root->left, str, i); 28 MySerialize(root->right, str, i); 29 } 30 } 31 char* Serialize(TreeNode *root) { 32 char *str=new char[1000]; 33 int i=0; 34 MySerialize(root, str, i); 35 str[i]='\0'; 36 return str; 37 } 38 bool ReadFromStr(char *str, int &i, int &val) 39 { 40 if(str[i]=='$') 41 { 42 i=i+2; 43 return false; 44 } 45 int tmp[20]; 46 int j; 47 while(str[i]!=',' && str[i]!='\0') 48 { 49 tmp[j++]=str[i++]; 50 } 51 ++i; 52 val=0; 53 for(int idx=0; idx<j; ++idx) 54 { 55 val=val*10+(int)(tmp[idx]-'0'+0); 56 } 57 return true; 58 } 59 TreeNode * MyDeserialize(char *str, int &i) 60 { 61 int val; 62 if(ReadFromStr(str, i, val))//将字符串转化为数字,遇见$则返回false 63 { 64 TreeNode * tmp=new TreeNode(val); 65 tmp->left=MyDeserialize(str, i); 66 tmp->right=MyDeserialize(str, i); 67 return tmp; 68 }else{ 69 return NULL; 70 } 71 } 72 TreeNode* Deserialize(char *str) { 73 if(str==NULL)return NULL; 74 int i=0; 75 return MyDeserialize(str, i); 76 } 77 };