Skip to content
本页目录

37-序列化二叉树

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树。 你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。 提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

示例:

输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]

注意:本题与主站 297 题相同:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/

思路: BFS

思路:序列化使用bfs展开node 反序列化使用同样的bfs从queue中取出节点,注意是判断split nodes[index] 里面的数值

实现代码

csharp
public class Codec {

    // Encodes a tree to a single string.
    public string serialize(TreeNode root) {
        if(root == null){
            return "null";
        }
        //展开
        string result = "";
        Queue<TreeNode> queue = new Queue<TreeNode>();
        queue.Enqueue(root);
        while(queue.Count > 0){
            int count = queue.Count;
            for(int i=0; i<count; i++){
                TreeNode node = queue.Dequeue();
                if(node != null){
                    result += node.val+",";
                    queue.Enqueue(node.left);
                    queue.Enqueue(node.right);
                }
                else{
                    result += "null,";
                }
            }
        }
        //移除最后一个,
        Console.WriteLine(result.Substring(0,result.Length -1));
        return result.Substring(0,result.Length -1);
    }

    private TreeNode createNode(string strVal){
        if(strVal == "null"){
            return null;
        }
        else{
            int val = Convert.ToInt32(strVal);
            TreeNode node = new TreeNode(val);
            return node;
        }        
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(string data) {
        if(data == "null"){
            return null;
        }
        string[] nodes = data.Split(",");
        int index = 1;
        Queue<TreeNode> queue = new Queue<TreeNode>();
        TreeNode root = createNode(nodes[0]);
        queue.Enqueue(root);
        while(queue.Count > 0){
            int count = queue.Count;
            for(int i=0; i<count; i++){
                TreeNode node = queue.Dequeue();
                //这里判断下一个节点 nodes[index]
                if(index < nodes.Length && nodes[index] != "null"){
                    node.left = createNode(nodes[index]);
                    queue.Enqueue(node.left);
                }
                index++;

                if(index < nodes.Length && nodes[index] != "null"){
                    node.right = createNode(nodes[index]);
                    queue.Enqueue(node.right);
                }
                index++;
            }
        }
        return root;
    }
}

Released under the MIT License.