Skip to content
本页目录

0297-二叉树的序列化和反序列化

https://leetcode.cn/problems/serialize-and-deserialize-binary-tree

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

示例 1:

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

示例 2:

输入:root = []
输出:[]

示例 3:

输入:root = [1]
输出:[1]

示例 4:

输入:root = [1,2]
输出:[1,2]

提示:

  • 树中结点数在范围 [0, 10^4] 内
  • -1000 <= Node.val <= 1000

思路

序列化时: 使用广度优先搜索序列化每个节点,将节点值存放到Queue中去,每个null也都处理,最后的null可以舍去

反序列化时: 同样适用广度优先搜索,首先构造根节点放入Queue中,然后逐次展开 赋值子节点

参考代码

csharp
public class Codec {

	private string GetString(string val){
		return val == null ? "null" : val;
	}

    // Encodes a tree to a single string.
    public string serialize(TreeNode root) {
    	if(root == null){
    		return null;
    	}
        Queue<TreeNode> myQueue = new Queue<TreeNode>();
        myQueue.Enqueue(root);
        List<string> result = new List<string>();

        while(myQueue.Count > 0){
        	int count = myQueue.Count;
        	for(int i=0; i<count; i++){
        		TreeNode node = myQueue.Dequeue();	
        		result.Add(node == null ? null : node.val.ToString());
        		if(node != null){
       				myQueue.Enqueue(node.left);	
      				myQueue.Enqueue(node.right);	
        		}
        	}
        }

        string str = "";
        //找寻最后非null节点
        int endIndex = result.Count-1;
        while(result[endIndex] == null){
        	endIndex--;
        }

        for(int i=0; i<=endIndex;i++){
        	str = i==0?result[i]:str+","+GetString(result[i]);
        }
        Console.WriteLine(str);
        return str;
    }

// Decodes your encoded data to tree.
    public TreeNode deserialize(string data) {
        if(data == null){
        	return null;
        }
        string[] strs = data.Split(",");
        //构造二叉树
        int index = 0;

        TreeNode root = new TreeNode();
        root.val = strs[index] == "null" ? 0 : Convert.ToInt32(strs[index]);
        index++;

        Queue<TreeNode> myQueue = new Queue<TreeNode>();
        myQueue.Enqueue(root);

        while(myQueue.Count > 0){
        	int count = myQueue.Count;
        	for(int i=0; i<count; i++){
        		TreeNode node = myQueue.Dequeue();	
        		//构造左节点
        		if(index < strs.Length && strs[index] != "null" ){
        			node.left = new TreeNode();
        			node.left.val = strs[index] == "null" ? 0 : Convert.ToInt32(strs[index]);
        			myQueue.Enqueue(node.left);
        		}
        		index++;
        		//构造右节点
        		if(index < strs.Length && strs[index] != "null"){
        			node.right = new TreeNode();
        			node.right.val = strs[index] == "null" ? 0 : Convert.ToInt32(strs[index]);
        			myQueue.Enqueue(node.right);
        		}
        		index++;
        	}
        }

        return root;
    }
}

Released under the MIT License.