lintcode 7. 二叉树的序列化和反序列化

描述
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。

如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。

对二进制树进行反序列化或序列化的方式没有限制,LintCode 将您的 serialize 输出作为 deserialize 的输入,它不会检查序列化的结果。

思路:按树的深度依次存储,#表示子节点都是空的节点,$表示空节点。

class TreeNode {
public:
	int val;
	TreeNode *left, *right;
	TreeNode(int val) {
		this->val = val;
		this->left = this->right = NULL;
	}
};

class lintcode_7 {
public:
	void splitString(const string &s, vector<string> &v, string c)
	{
		string::size_type pos1, pos2;
		pos2 = s.find(c);
		pos1 = 0;
		while (string::npos != pos2)
		{
			v.push_back(s.substr(pos1, pos2 - pos1));
			pos1 = pos2 + c.size();
			pos2 = s.find(c, pos1);
		}
		if (pos1 != s.length())
			v.push_back(s.substr(pos1));
	}
	
	string serialize(TreeNode * root) {
		if (root == NULL) return "";
		vector<TreeNode *> vctNote;
		string strOut;
		vctNote.push_back(root);
		do
		{
			vector<TreeNode *> vctTemp;
			for (size_t i = 0; i < vctNote.size(); ++i)
			{
				if (vctNote[i] != 0)
				{
					strOut += to_string(vctNote[i]->val) + ",";
					if (vctNote[i]->left == NULL && vctNote[i]->right == NULL)
						strOut += "#,";
					else
					{
						vctTemp.push_back(vctNote[i]->left);
						vctTemp.push_back(vctNote[i]->right);
					}
				}
				else
					strOut += "$,";
			}
			vctNote = vctTemp;
		} while (vctNote.size() > 0);
		return strOut;
	}

	TreeNode * deserialize(string &data) {
		vector<string> vctSplit;
		splitString(data, vctSplit, ",");
		if (vctSplit.empty())
			return NULL;
		TreeNode * pHead = new TreeNode(stoi(vctSplit[0], nullptr, 0));
		vector<TreeNode *> vctNote;
		vctNote.push_back(pHead);
		size_t i = 1;
		while (i < vctSplit.size())
		{
			vector<TreeNode *> vctTemp;
			for (size_t n = 0; n < vctNote.size(); ++n)
			{
				if (i < vctSplit.size() && vctSplit[i] != "$")
				{
					TreeNode * pTemp = new TreeNode(stoi(vctSplit[i], nullptr, 0));
					vctNote[n]->left = pTemp;
					if (i + 1 < vctSplit.size())
					{
						if (vctSplit[i + 1] == "#")
							++i;
						else
							vctTemp.push_back(pTemp);
					}
				}
				if (i + 1 < vctSplit.size() && vctSplit[i + 1] != "$")
				{
					TreeNode * pTemp = new TreeNode(stoi(vctSplit[i + 1], nullptr, 0));
					vctNote[n]->right = pTemp;
					if (i + 2 < vctSplit.size())
					{
						if (vctSplit[i + 2] == "#")
							++i;
						else
							vctTemp.push_back(pTemp);
					}
				}
				i += 2;
			}
			vctNote = vctTemp;
		}
		return pHead;
	}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值