C++ 迭代实现,无递归
序列化二叉树
http://www.nowcoder.com/questionTerminal/cf7e25aa97c04cc1a68c8f040e71fb84
C++ 迭代实现,无递归
class Solution { public: string str; char* Serialize(TreeNode *root) { if(root == nullptr) return nullptr; char* res; stack<TreeNode*> stk; stk.push(root); while(!stk.empty()) { TreeNode* node = stk.top(); stk.pop(); if(node == nullptr) str += "#!"; else { str += to_string(node->val); str += "!"; stk.push(node->right); stk.push(node->left); } } res = const_cast<char*>(str.c_str()); return res; } TreeNode* Deserialize(char *str) { if(str == nullptr) return nullptr; char** s_str = &str; vector<char*> v; //将字符串分割 装进vector while(**s_str != '\0') { char* c = strtok(*s_str, "!"); v.push_back(c); *s_str += (strlen(c) + 1); } stack<TreeNode*> stk; TreeNode* root = new TreeNode(atoi(v[0])); TreeNode* node = root; int index = 0; while(!stk.empty() || node != nullptr) { while(node && index+1 < v.size()) { //当前节点非空 stk.push(node);//将节点加入栈中 - 非空节点 if(index+1 < v.size() && (strcmp(v[index+1], "#") != 0)) { TreeNode* child = new TreeNode(atoi(v[index+1])); node->left = child;//不断构造左节点 } node = node->left; index++; } //当左子树遍历完最后一个叶子节点时 node = stk.top(); //取出上个节点 if(index+1 < v.size() && (strcmp(v[index+1], "#") != 0)) { TreeNode* child = new TreeNode(atoi(v[index+1])); node->right = child; //构造右节点 } stk.pop();//当前节点的左右子节点均构造完成,可以弹出 node = node->right; //以当右节点为新的节点 index++; } return root; } };