PROBLEM
剑指 Offer 37. 序列化二叉树
难度 困难
MY ANSWER
- 队列实现bfs,使用to_string来实现int到string的转换,从而实现二叉树的序列化。
- 首先使用循环与substr对字符串进行分割,储存到string向量中。同样使用队列实现二叉树的构建,从队头中取节点添加儿子节点,将儿子节点入队。同时遍历string向量,index指示当前节点对应的儿子节点的值,构建节点使用stoi将字符串转换为int。
- 时间复杂度O(n),空间复杂度O(n)。
class Codec { public: string serialize(TreeNode* root) { if(!root) { return "[]"; } string str = "["; queue<TreeNode*> bfs; bfs.push(root); int cnt = 0; while(bfs.size()) { cnt++; TreeNode* tmp = bfs.front(); if(tmp) { str += to_string(tmp->val) + ","; bfs.push(tmp->left); bfs.push(tmp->right); } else { str += "null,"; } bfs.pop(); } str[str.length() - 1] = ']'; return str; }
TreeNode* deserialize(string data) { TreeNode* root = NULL; if(!data.compare("[]")) { return root; } vector<string> seq; int start = 1, end = 1; for(int i = 1; i < data.length(); i++) { if(data[i] == ',' || data[i] == ']') { end = i; seq.push_back(data.substr(start, end - start)); start = end + 1; } } root = new TreeNode(stoi(seq[0])); queue<TreeNode*> bfs; bfs.push(root); int index = 1; while(index < seq.size() && bfs.size()) { TreeNode* tmp = bfs.front(); if(!tmp) { bfs.pop(); continue; } if(seq[index].compare("null")) { tmp->left = new TreeNode(stoi(seq[index])); } else { tmp->left = NULL; } bfs.push(tmp->left); index++; if(seq[index].compare("null")) { tmp->right = new TreeNode(stoi(seq[index])); } else { tmp->right = NULL; } bfs.push(tmp->right); index++; bfs.pop(); } return root; } };
|
BETTER SOLUTION
思路相同。
SUMMARY
bfs实现对树的层序遍历,注意to_string、stoi、substr这几个库函数的调用。