剑指offer67题-No61.序列化二叉树
  • 序列化二叉树即找一种顺序存储二叉树的节点,并以相同的方式能够读取序列重新构建。
  • 换种说法,就是遍历二叉树,记录每个节点,再以同样的方式遍历就可以还原二叉树。

PS:能基于序列化字符串单独还原树的情况

  1. 层次遍历序列(需标记空节点)。
  2. 前序或后序遍历序列(需结合中序,或显式标记空节点,如 [1,2,null,null,3])。若序列化时未标记空节点,则只有层次遍历或前序+中序/后序+中序的组合能唯一还原

本题,可以参考牛客做法,用前序遍历来实现序列化与反序列化。

class Solution {
public:
    string dfs(TreeNode* root){
        if(root == nullptr) return "#";
        string str;
        str += to_string(root->val) + "!"; // 用!分割数字 以免出现13和1、3混淆这种情况
        str += dfs(root->left);
        str += dfs(root->right);
        return str;
    }
    TreeNode* deserialHandle(char* &str){
        if(*str == '#'){
            // 如果是# 忽略 找下一个
            return nullptr; 
        }
        int num = 0;
        while(*str != '!'){
            num = num * 10 + (*str) - '0';
            str++;
        }
        TreeNode* node = new TreeNode(num);
        node->left = deserialHandle(++str);
        node->right = deserialHandle(++str);
        return node;
    }
    char* Serialize(TreeNode *root) {    
        string str = dfs(root);
        char *res = new char[str.size() + 10];
        for(int i = 0; i < str.size(); ++i){
            res[i] = str[i];
        }
        return res;
    }
    TreeNode* Deserialize(char *str) {
        return deserialHandle(str);
    }
};

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇