二叉樹應用_序列化二叉樹

題目:實現兩個函數,實現序列化和反序列化二叉樹。
分析:我們可以從前序遍歷和中序遍歷序列構造出一個二叉樹。我們可以先把一顆二叉樹序列化成一個前序遍歷序列和一箇中序遍歷序列,然後進行構造。但是這個思路有兩個缺點,一個是要求兩個序列中所有數據都讀出後才能開始反序列化,另外要求不能有數值重複的節點。
我們可以根據前序遍歷的順序來序列化二叉樹,前序遍歷是從根節點開始的。當在遍歷二叉樹碰到NULL指針時,將NULL換成一個特數字符,此外節點的數字之間要用一個特殊字符隔開。
實現如下:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
 void bulid_serialize(TreeNode *root,string &str)
 {
     if(root==NULL)
     {
         str+='#';
         return ;
     }
     str+=to_string(root->val);
     str+=',';
     bulid_serialize(root->left,str);
     bulid_serialize(root->right,str);
 }
 //字符串轉成char*
 char*serialize(string &str)
 {
     string str;
     bulid_serialize(root,str);
     char* result=new char[str.size()+1];
     int i;
     for( i=0;i<str.size();++i)
     {
         result[i]=str[i];
     }
     result[i]='\0';
     return result;
 }
 //反序列化
TreeNode *DeserializeCore(char **str) {
   if (**str == '#') {
       ++(*str);
       return nullptr;
   }
   int value = 0;
   while (**str != '\0' && **str != ',') {
       value = value * 10 + ((**str) - '0');
       ++(*str);
   }
   TreeNode *node = new TreeNode(value);
   if (**str != '\0') {
       ++(*str);
       node->left = DeserializeCore(str);
       node->right = DeserializeCore(str);
   }
   return node;
}

TreeNode* Deserialize(char *str) {
   return DeserializeCore(&str);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章