• 序列化二叉树


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

    二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 !表示一个结点值的结束(value!)。

    二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

    /*
    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 *pRoot) {
            string s;
            if (!pRoot)
                return nullptr;
            deque<TreeNode*> q;
            q.push_back(pRoot);
            while (!q.empty()) {
                int n = q.size();
                for (int i = 0; i < n; ++i) {
                    if (q.front()) {
                        q.push_back(q.front()->left);
                        q.push_back(q.front()->right);
                        s += to_string(q.front()->val) + ' ';
                    } else {
                        // 如果是nullptr,则使用# 表示
                        s += "# ";
                    }
                    q.pop_front();
                }
            }
            char* chr = strdup(s.c_str());
            return  chr;
        }
        TreeNode* Deserialize(char *str) {
            if (!str)
                return nullptr;
            int k = 0;
            auto ret = nextNode(str, k);
            deque<TreeNode*> q;
            q.push_back(ret);
            while (!q.empty()) {
                int n = q.size();
                for (int i = 0; i < n; ++i) {               
                    q.front()->left = nextNode(str, k);
                    q.front()->right = nextNode(str, k);
                    if (q.front()->left)
                        q.push_back(q.front()->left);
                    if (q.front()->right)
                        q.push_back(q.front()->right);
                    q.pop_front();
                }
            }
            return ret;
        }
        TreeNode* nextNode(char *str,int &i) {
            string s;
            while (str[i] != ''&&str[i] != ' ') {
                if (str[i] == '#') {
                    i += 2;
                    return nullptr;
                }
                s += str[i];
                i++;
            }
            if (str[i] == ' ')
                i++;
            if (!s.empty())
                return new TreeNode(stoi(s));
            return nullptr;
        }
    };
  • 相关阅读:
    Linux设备驱动阻塞与非阻塞I/O
    Linux设备驱动轮询操作
    Linux设备驱动中的并发控制
    Python趣味入门8:集合变量列表、集合、元组、字典
    买我的《Python青少年趣味编程》给寒假爱编程的小朋友一点温暖。
    第56篇ProfileData与DataLayout
    第59篇编译策略
    第60篇获取编译任务
    第63篇解释器与编译器适配(二)
    第57篇profile实例
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11470049.html
Copyright © 2020-2023  润新知