LeetCode(算法)- 297. 二叉树的序列化与反序列化

Posted 放羊的牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(算法)- 297. 二叉树的序列化与反序列化相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接

题目大意:

解题思路:

相关企业

  • Facebook
  • 亚马逊(Amazon)
  • 微软(Microsoft)
  • 谷歌(Google)
  • 英伟达(NVIDIA)
  • 优步(Uber)
  • 苹果(Apple)
  • 甲骨文(Oracle)

AC 代码

  • Java
/**
 * Definition for a binary tree node.
 * public class TreeNode 
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x)  val = x; 
 * 
 */

// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

// 解决方案(1)
public class Codec 

    public String serialize(TreeNode root) 
        StringBuilder sb = new StringBuilder();

        Queue<TreeNode> queue = new LinkedList<TreeNode>()offer(root);;
        while (!queue.isEmpty()) 
            TreeNode node = queue.poll();
            if (node == null) 
                sb.append(Integer.MAX_VALUE).append("#");
                continue;
            
            sb.append(node.val).append("#");
            queue.offer(node.left);
            queue.offer(node.right);
        
        return sb.toString();
    

    public TreeNode deserialize(String data) 
        String[] arr = data.split("#");
        int ptrPar = arr.length - 1, ptrSub = arr.length - 1;

        Map<Integer, TreeNode> nodeMap = new HashMap<>();
        Map<TreeNode, TreeNode> parLMap = new HashMap<>();
        Map<TreeNode, TreeNode> parRMap = new HashMap<>();
        boolean flag = true;
        while (ptrPar >= 0) 
            // 定位父亲指针
            while (arr[ptrPar].equals(String.valueOf(Integer.MAX_VALUE))) 
                ptrPar--;
            

            // 生成父节点
            TreeNode parNode = new TreeNode(Integer.valueOf(arr[ptrPar]));
            nodeMap.put(ptrPar--, parNode);

            // 生成儿子节点
            TreeNode lNode, rNode;
            if (nodeMap.containsKey(ptrSub)) 
                rNode = nodeMap.get(ptrSub);
             else 
                Integer arrValue = Integer.valueOf(arr[ptrSub]);
                rNode = new TreeNode(arrValue);
                if (!arrValue.equals(Integer.MAX_VALUE)) 
                    flag = false;
                
                if (flag) 
                    parRMap.put(rNode, parNode);
                
            
            ptrSub--;

            if (nodeMap.containsKey(ptrSub)) 
                lNode = nodeMap.get(ptrSub);
             else 
                Integer arrValue = Integer.valueOf(arr[ptrSub]);
                lNode = new TreeNode(arrValue);
                if (!arrValue.equals(Integer.MAX_VALUE)) 
                    flag = false;
                
                if (flag) 
                    parLMap.put(lNode, parNode);
                
            
            ptrSub--;

            // 组合节点
            parNode.right = rNode;
            parNode.left = lNode;
        

        // 满二叉树转换完全二叉树(去除末尾的 NULL)
        convertTree(parLMap, parRMap);

        return nodeMap.get(0);
    

    private void convertTree(Map<TreeNode, TreeNode> parLMap, Map<TreeNode, TreeNode> parRMap) 
        for (Map.Entry<TreeNode, TreeNode> item : parLMap.entrySet()) 
            item.getValue().left = null;
        
        for (Map.Entry<TreeNode, TreeNode> item : parRMap.entrySet()) 
            item.getValue().right = null;
        
    


// 解决方案(2)
public class Codec 
    public String serialize(TreeNode root) 
        if(root == null) return "[]";
        StringBuilder res = new StringBuilder("[");
        Queue<TreeNode> queue = new LinkedList<>()  add(root); ;
        while(!queue.isEmpty()) 
            TreeNode node = queue.poll();
            if(node != null) 
                res.append(node.val + ",");
                queue.add(node.left);
                queue.add(node.right);
            
            else res.append("null,");
        
        res.deleteCharAt(res.length() - 1);
        res.append("]");
        return res.toString();
    

    public TreeNode deserialize(String data) 
        if(data.equals("[]")) return null;
        String[] vals = data.substring(1, data.length() - 1).split(",");
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        Queue<TreeNode> queue = new LinkedList<>()  add(root); ;
        int i = 1;
        while(!queue.isEmpty()) 
            TreeNode node = queue.poll();
            if(!vals[i].equals("null")) 
                node.left = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.left);
            
            i++;
            if(!vals[i].equals("null")) 
                node.right = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.right);
            
            i++;
        
        return root;
    
  • C++
/**
 * Definition for a binary tree node.
 * struct TreeNode 
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) 
 * ;
 */

// Your Codec object will be instantiated and called as such:
// Codec ser, deser;
// TreeNode* ans = deser.deserialize(ser.serialize(root));

class Codec 
public:
    // Encodes a tree to a single string.
    string serialize(TreeNode* root) 
        if(root == nullptr) return "[]";
        string res = "[";
        queue<TreeNode*> que;
        que.emplace(root);
        while(!que.empty()) 
            TreeNode* node = que.front();
            que.pop();
            if(node != nullptr) 
                res += (to_string(node->val) + ",");
                que.emplace(node->left);
                que.emplace(node->right);
            
            else res += "null,";
        
        res.pop_back();
        res += "]";
        return res;
    

    // Decodes your encoded data to tree.
    TreeNode* deserialize(string data) 
        if (data == "[]")
            return nullptr;
        vector<string> list = split(data.substr(1, data.length() - 2), ",");
        TreeNode *root = new TreeNode(std::stoi(list[0]));
        queue<TreeNode*> que;
        que.emplace(root);
        int i = 1;
        while(!que.empty()) 
            TreeNode *node = que.front();
            que.pop();
            if(list[i] != "null") 
                node->left = new TreeNode(std::stoi(list[i]));
                que.emplace(node->left);
            
            i++;
            if(list[i] != "null") 
                node->right = new TreeNode(std::stoi(list[i]));
                que.emplace(node->right);
            
            i++;
        
        return root;
    
    
private:
    // Split a str by a delim
    vector<string> split(string str, string delim) 
        vector<string> list;
        int i = 0, j = 0, len = str.length();
        while (i < len) 
            while (j < len && str[j] != ',')
                j++;
            list.push_back(str.substr(i, j - i));
            i = ++j;
        
        return list;
    
;

以上是关于LeetCode(算法)- 297. 二叉树的序列化与反序列化的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 297. 二叉树的序列化与反序列化(bfs,二叉树,Java)

Leetcode刷题Python297. 二叉树的序列化与反序列化

LeetCode Java刷题笔记—297. 二叉树的序列化与反序列化

LeetCode 297. 二叉树的序列化与反序列化

LeetCode 297.序列化二叉树 - JavaScript

LeetCode 297 二叉树的序列化与反序列化[BFS 二叉树] HERODING的LeetCode之路