刷题——序列化二叉树

序列化二叉树_牛客题霸_牛客网

char*传入,以 "!"分割,以"#"表示无

cpp 复制代码
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
void reserialize(TreeNode* root, string& str)
{
	if(root == NULL)
	{
		str += "#";
	}else{
		str += to_string(root->val) + "!";
		reserialize(root->left, str);
		reserialize(root->right, str);
	}
}

    char* Serialize(TreeNode *root) {   
        if(root == NULL) 
             return "#";  
        string ret;
    	reserialize(root, ret);
        char* charRet = new char[ret.length() + 1];
        strcpy(charRet, ret.c_str());
        charRet[ret.length()] = '\0';
	    return charRet; 
    }

    TreeNode* DeserializeFunction(char** str)
    {
        if(**str == '#')
        {
            (*str)++;
            return NULL;
        }
        int val = 0;
        while(**str != '!' && **str != '\0')
        {
            val = val*10 +((**str) - '0');
            (*str)++;
        }
        TreeNode* root =  new TreeNode(val);
        if(**str == '\0')
            return root;
        else
           (*str)++;
        root->left = DeserializeFunction(str); 
        root->right = DeserializeFunction(str);
        return root;
    }


    TreeNode* Deserialize(char *str) {
        TreeNode* res = DeserializeFunction(&str);
        return res;
    }
};

. - 力扣(LeetCode)

cpp 复制代码
//由root进入,使用str将字符串带出
void reserialize(TreeNode* root, string& str)
{
	if(root == nullptr)
	{
		str += "None,";
	}else{
		str += to_string(root->val) + ",";
		reserialize(root->left, str);
		reserialize(root->right, str);
	}
}

//将二叉树转化程字符串
string serialize(TreeNode* root)
{
	string ret;
	reserialize(root, ret);
	return ret;
}

TreeNode* rdeserialize(list<string>& dataArray)
{
	if(dataArray.front() ==  "None")
	{
		dataArray.erase(dataArray.begin());
		return nullptr;
	}
	TreeNode* root = new TreeNode(stoi(dataArray.front()));
	dataArray.erase(dataArray.begin());
	root->left = rdeserialize(dataArray);
	root->right = rdeserialize(dataArray);
	return root;
}
TreeNode* deserialize(string data)
{
	list<string> dataArray;
	string str;
	for(auto& ch : data)
	{
		if(ch == ',')
		{
			dataArray.push_back(str);
			str.clear();
		}
		else
		{
			str.push_back(ch);
		}
	}
	if(!str.empty())
	{
		dataArray.push_back(str);
		str.clear();
	}
	return rdeserialize(dataArray);
}
相关推荐
Chloeis Syntax14 小时前
栈和队列笔记2025-10-12
java·数据结构·笔记·
404未精通的狗14 小时前
(数据结构)线性表(下):链表分类及双向链表的实现
数据结构·链表
晨非辰15 小时前
【面试高频数据结构(四)】--《从单链到双链的进阶,读懂“双向奔赴”的算法之美与效率权衡》
java·数据结构·c++·人工智能·算法·机器学习·面试
im_AMBER15 小时前
数据结构 03 栈和队列
数据结构·学习·算法
卿言卿语17 小时前
CC1-二叉树的最小深度
java·数据结构·算法·leetcode·职场和发展
仰泳的熊猫17 小时前
LeetCode:889. 根据前序和后序遍历构造二叉树
数据结构·c++·算法
Emilia486.18 小时前
【Leetcode&nowcode&数据结构】单链表的应用(初阶)
c语言·数据结构·算法·leetcode
仰泳的熊猫19 小时前
LeetCode:700. 二叉搜索树中的搜索
数据结构·c++·算法·leetcode
杰 .20 小时前
C++ Hash
数据结构·c++·哈希算法
韧竹、20 小时前
数据结构之单链表
数据结构·链表