zoukankan      html  css  js  c++  java
  • 序列化二叉树

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

    二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 !表示一个结点值的结束(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;
        }
    };
  • 相关阅读:
    python打包--pyinstaller打包报错
    acl的基本知识点
    Oracle下PLSQL连接没有数据库的问题
    vSphere 查看FC HBA的WWNN和WWPN
    Nginx代理服务——反向代理
    Nginx作为web静态资源服务器——防盗链
    Nginx作为web静态资源服务器——跨域访问
    Nginx作为静态web服务器——缓存原理
    Nginx静态资源Web服务
    Nginx的请求限制
  • 原文地址:https://www.cnblogs.com/zhudingtop/p/11470049.html
Copyright © 2011-2022 走看看