LintCode 7:Binary Tree Serialization

Problem:Design an algorithm and write code to serialize and deserialize a binary tree. Writing the tree to a file is called 'serialization' and reading back from the file to reconstruct the exact same binary tree is 'deserialization'.


class Solution {
public:
	/**
	* This method will be invoked first, you should design your own algorithm
	* to serialize a binary tree which denote by a root node to a string which
	* can be easily deserialized by your own "deserialize" method later.
	*/
	string serialize(TreeNode *root) {
		queue<TreeNode*> node;
		vector<string> result;
		TreeNode* tmp;

		node.push(root);
		while (!node.empty()) {
			tmp = node.front();
			node.pop();
			if (tmp)
				result.push_back(to_string(tmp->val));
			else {
				result.push_back("#");
				continue;
			}
			if (tmp->left)
				node.push(tmp->left);
			else
				node.push(nullptr);
			if (tmp->right)
				node.push(tmp->right);
			else
				node.push(nullptr);
		}
		string r;
		for (int i = 0;i<result.size();i++) {
			r += result[i] + " ";
		}
		return r;

	}

	/**
	* This method will be invoked second, the argument data is what exactly
	* you serialized at method "serialize", that means the data is not given by
	* system, it's given by your own serialize method. So the format of data is
	* designed by yourself, and deserialize it here as you serialize it in
	* "serialize" method.
	*/
	TreeNode *deserialize(string data) {
		istringstream iss(data);
		vector<TreeNode*> tree;
		TreeNode* tmp;
		string str;
		getline(iss, str, ' ');
		while (!str.empty()) {
			if (str != "#")
				tmp = new TreeNode(stoi(str));
			else
				tmp = nullptr;
			tree.push_back(tmp);
			getline(iss, str, ' ');
		}
		TreeNode* head=tree[0];
		int parent = 0;
		int child = 1;
		while (child<tree.size()) {
			tmp = tree[parent];
			if (!tmp) {
				parent++;
				continue;
			}
				
			tmp->left = tree[child];
			tmp->right = tree[child+1];
			child += 2;
			parent++;
		}
		return head;
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值