栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

剑指offer 50.序列化二叉树

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

剑指offer 50.序列化二叉树

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

您需要确保二叉树可以序列化为字符串,并且可以将此字符串反序列化为原始树结构。

数据范围

树中节点数量 [0,1000]。

样例

你可以序列化如下的二叉树
    8
   / 
  12  2
     / 
    6   4

为:"[8, 12, 2, null, null, 6, 4, null, null, null, null]"
class Solution {
public:
    //序列化二叉树,并能反序列,本地是按照前序遍历,即 根  左  右
    //该题也学到了两个技巧一个to_string,一个已知数字字符串的左右端点转为数字
    // Encodes a tree to a single string.
    //二叉树转化为字符串
    string serialize(TreeNode* root) {
        string res; //定义答案
        dfs_s(root,res);//递归处理
        return res;
    }
    void dfs_s(TreeNode*root,string&res) //res为地址传递,所以不用返回string了
    {
        if(!root)  //如果根节点为空
        {
            res+="null "; //在后面加入null和空格
            return ;
        }
        res+=to_string(root->val)+' ';//res加上该节点的val值和一个空格
        dfs_s(root->left,res);//递归处理左右子树
        dfs_s(root->right,res);
    }
    //将上述字符串反序列化为二叉树
    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) {
        int u=0;
        return dfs_d(data,u);
    }
    TreeNode* dfs_d(string data,int &u)  //u为地址传递
    {   
         if(u==data.size())  return NULL;//如果U到了字符串尾端则退出
        int k=u;
        while(data[k]!=' ') k++; //将k更新到连续数字后面的空格,或者更新到null后面的空格
        if(data[u]=='n') //如果u到了null的n,则说明该节点没有孩子节点,此时应该直接跳过后面的递归左右儿子
        {
            u=k+1; //同时要将u更新成下个结点,即null和空格后面的那个位置
            return NULL;
        }
        int val=0,sign=1;
        if(uleft=dfs_d(data,u);//递归处理该节点的左右子树
        root->right=dfs_d(data,u);
        return root;
    }

};

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/890085.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号