三个功能:先序遍历打印、节点先序遍历序列化、字符串先序遍历反序列化
#include <iostream> #include <string> #include <vector> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int val) : val(val), left(nullptr), right(nullptr) {} }; //递归打印后序遍历 void lastOrderRecur(TreeNode* head) { if (head == nullptr) return; lastOrderRecur(head->left); lastOrderRecur(head->right); cout << head->val << ", "; } //按照节点后序遍历进行序列化成一个字符串 string serialByLastOrder(TreeNode* head) { //如果是空节点就序列化成#! if (head == nullptr) { return "#!"; } string res = serialByLastOrder(head->left); res = res + serialByLastOrder(head->right); res = res + std::to_string(head->val) + "!"; return res; } //按照一个字符串数组构造出一棵树并返回这棵树的根节点 //关键就在于这个引用就地改变 TreeNode* deserialByLastHelp(vector<int>& vec) { int value = vec.back(); vec.pop_back(); if (value == -1) return nullptr; TreeNode* node = new TreeNode(value); node->right = deserialByLastHelp(vec); node->left = deserialByLastHelp(vec); return node; } //123!#! TreeNode* deserialByLastOrder(char* str) { vector<int> vec; //考察到字符串的反向遍历 //首先要把str这个字符串转化成一个vector<int>数组,因为字符串不好从后面遍历 //首先判断一下这是不是一棵空树 if (str == nullptr) return nullptr; while(*str) { while (*str == ‘#‘) { //如果是空节点干脆就存-1进去,避免和0冲突了 vec.push_back(-1); str++; str++; } int val = 0; while (*str != ‘!‘) { val = 10 * val + (*str - ‘0‘); str++; } vec.push_back(val); str++;//同时要跳过那个! } cout << "vec see:"; for (auto start = vec.begin(); start != vec.end(); start++) { cout << *start << ","; } return deserialByLastHelp(vec); } int main() { TreeNode* head = new TreeNode(5); head->left = new TreeNode(3); head->right = new TreeNode(8); head->left->left = new TreeNode(1); head->left->right = new TreeNode(2); head->right->left = new TreeNode(4); head->right->right = new TreeNode(5); head->right->left->left = new TreeNode(6); head->right->right->left = new TreeNode(9); head->right->right->right = new TreeNode(11); cout << "last-order:"; lastOrderRecur(head); cout << "\nserial binary:"; string res = serialByLastOrder(head); cout << res << endl; char* s_char = (char*)res.c_str();//从string转换到char* TreeNode* dehead = deserialByLastOrder(s_char); cout << "\ndeserial binary:"; lastOrderRecur(dehead); return 0; }
原文:https://www.cnblogs.com/logic03/p/15107612.html