刷题——序列化二叉树

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

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);
}
相关推荐
季明洵38 分钟前
动态规划及背包问题
java·数据结构·算法·动态规划·背包问题
深邃-1 小时前
数据结构-双向链表
c语言·开发语言·数据结构·c++·算法·链表·html5
Lisssaa2 小时前
打卡第二十八天
数据结构·算法
weixin_649555672 小时前
C语言程序设计第四版(何钦铭、颜晖)第十一章指针进阶之查找星期
数据结构·算法
北顾笙9802 小时前
day10-数据结构力扣
数据结构
炘爚2 小时前
C++(普通指针和成员的区别、指针的使用场景和存储内容)
数据结构·c++·算法
Book思议-2 小时前
【数据结构考研真题】栈和队列(小题)
数据结构·考研·栈和队列·408小题
阿Y加油吧3 小时前
面试硬核双杀!合并 K 个升序链表 + LRU 缓存|力扣高频手撕原题全解
数据结构·leetcode·链表
计算机安禾3 小时前
【数据结构与算法】第12篇:栈(二):链式栈与括号匹配问题
c语言·数据结构·c++·学习·算法·visual studio code·visual studio
散峰而望3 小时前
【数据结构】单调栈与单调队列深度解析:从模板到实战,一网打尽
开发语言·数据结构·c++·后端·算法·github·推荐算法