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

    剑指OFFER 序列化二叉树

    弄了半天在剑指OFFER OJ上无法通过(猜测可能是因为剑指OFFER上使用的是char类型的指针,导致有一些编译的不一致问题),同样的代码在leetcode上通过了

    代码

    /**
     * Definition for a binary tree node.
     * struct TreeNode {
     *     int val;
     *     TreeNode *left;
     *     TreeNode *right;
     *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
     * };
     */
    class Codec {
    public:
        int pos = 0;
        string str;
        string res;
    
        void recur_from_order(TreeNode* &node)
        {
            if(str[pos] == '#'){
                node = NULL;
                return;
            }else{
                string str_num;
                while(str[pos] != '!')
                {
                    str_num += str[pos];
                    pos++;
                }
                //int num = stoi(str_num);
                int num = atoi(str_num.c_str());
                node = (TreeNode*)malloc(sizeof(TreeNode));
                node->val = num;
            }
            pos++;
            recur_from_order(node->left);
            pos++;
            recur_from_order(node->right);
        }
        
        void recur_to_order(TreeNode *node)
        {
            if(node == NULL){
                res += '#';
                return;
            }else{
                res += to_string(node->val);
                res += '!';
            }
            recur_to_order(node->left);
            recur_to_order(node->right);
        }
        
        // Encodes a tree to a single string.
        string serialize(TreeNode* root) {
            recur_to_order(root);
            return res;
        }
    
        // Decodes your encoded data to tree.
        TreeNode* deserialize(string data) {
            str = data;
            TreeNode* ret;
            recur_from_order(ret);
            return ret;
        }
    };
    
    // Your Codec object will be instantiated and called as such:
    // Codec codec;
    // codec.deserialize(codec.serialize(root));
    

    采用的先序遍历的方式,先写序列化的代码,就是先序遍历一遍,遇到结点就记录到res中.

    反序列化稍微复杂一点,聚焦于两个状态,一个是结点,一个是字符串的位置指针,通过这两个状态来构建二叉树.

  • 相关阅读:
    win7下安装Linux实现双系统全攻略
    Dreamweaver_CS6安装与破解,手把手教程
    windows Server 2008各版本有何区别?
    如何查看路由器中的pppoe拨号密码?
    xp远程桌面连接最大用户数怎么设置?
    网站的盈利模式
    linux 下安装mysql-5.7.16
    GNS3连接虚拟机
    cain使用教程
    数据中心网络架构的问题与演进 — CLOS 网络与 Fat-Tree、Spine-Leaf 架构
  • 原文地址:https://www.cnblogs.com/virgildevil/p/12234806.html
Copyright © 2011-2022 走看看