61、序列化二叉树

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树

leetcode对应题目:

297. 二叉树的序列化与反序列化                 题目解答

449. 序列化和反序列化二叉搜索树 (感觉没区别啊,不晓得怎么利用性质,下面的方法做吧)

需要思考的知识:

  • 如何建立一个二叉树?前序,中序,后续,层次。
  • 如何实现stoi函数

序列化就是将一个数据结构或物体转化为一个位序列,可以存进一个文件或者内存缓冲器中,然后通过网络连接在相同的或者另一个电脑环境中被还原,还原的过程叫做去序列化。(摘自题目解答的博客中)

总结:观察图就知道是要利用层次遍历。因为leetcode的写法用的是字符串流,而且返回值也是string,所以我一开始移植。。到牛客网的时候发现OJ过不了,我是直接用了个栈存储,改成使用堆上的内存。这样就没问题了!一定要注意深拷贝和浅拷贝的问题

还有一个积累:如果要读取string类中存放的char*对象。

const char* p = str.c_str();//返回的是const char*

const char* p = str.data();

加' '的目的是为了将字符串流分割开。

ostringstream 写入到流中

//istringstream 从流中读取

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/class Solution {
public:
	char* Serialize(TreeNode *root) {
		if (!root)    return NULL;
		queue<TreeNode*> q;
		q.push(root);
		string str;
		while (!q.empty()) {
			TreeNode* t = q.front(); q.pop();
			if (t) {
				str += to_string(t->val);
				str += ' ';
				q.push(t->left);
				q.push(t->right);
			}
			else {
				str += "# ";
			}
		}
		char * ptr = new char[str.size()+1];
		strcpy(ptr, str.data());
		return ptr;
	}
	TreeNode* Deserialize(char *str) {
        if(!str)    return nullptr;
		string s(str);
		istringstream ss(s);
		string i;
		ss >> i;
		TreeNode* root = new TreeNode(stoi(i));
		queue<TreeNode*> q; q.push(root);
		while (!q.empty()) {
			TreeNode* t = q.front(); q.pop();
			if (!(ss >> i))    break;
			if (i != "#") {
				TreeNode* node = new TreeNode(stoi(i));
				t->left = node;
				q.push(node);
			}
			if (!(ss >> i))    break;
			if (i != "#") {
				TreeNode* node = new TreeNode(stoi(i));
				t->right = node;
				q.push(node);
			}
		}
		return root;
	}
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值