当前位置: 首页 > news >正文

LeetCode -- Serialize and Deserialize Binary Tree

题目描述:


Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.


Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.


For example, you may serialize the following tree


    1
   / \
  2   3
     / \
    4   5
as "[1,2,3,null,null,4,5]", just the same as how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.




就是写一个类,完成二叉树的序列化和反序列化。


所谓序列化,就是将一个对象变成流,对本题而言,是说把一个树对象转换成字符串的形式。


思路:


本题可以考虑DFS和BFS两种方式,可以根据具体应用情形进行选择。
但本题要求限制使用空间,因此BFS无法通过测试数据。




实现代码:




DFS 方式


使用先序遍历,即根左右的顺序递归执行。


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


    // Encodes a tree to a single string.
    public string serialize(TreeNode root) 
    {
        var sb = new StringBuilder();
        serialize(root, sb);
        return sb.ToString();
    }
    private void serialize(TreeNode root, StringBuilder sb) {
        if (root == null) {
            sb.Append(" # ");
        } else {
            sb.Append(root.val + " ");
            serialize(root.left, sb);
            serialize(root.right, sb);
        }
    }


    public TreeNode deserialize(string data) {
        if (data == null || data.Length == 0) {
            return null;
        }
		
		var values = data.Split(' ').Where(x => !string.IsNullOrWhiteSpace(x)).ToList(); // skip empty string in values. IMPORTANT
        return deserialize(ref values);
    }
    private TreeNode deserialize(ref List<string> values) {
		if(values.Count == 0){
			return null;
		}
		
        String val = values[0];
		values.RemoveAt(0);
		
        if (val == "#") {
            return null;
        }
		
        var root = new TreeNode(int.Parse(val));
        root.left = deserialize(ref values);
        root.right = deserialize(ref values);
        return root;
    }
	
}


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






BFS 方式(逐层序列化,存父节点)






public class Codec {


    // Encodes a tree to a single string.
      public string serialize(TreeNode root) {
		if(root == null){
			return "";
		}
		
        var result = root.val.ToString();
		var nodes = new List<TreeNode>();
		if(root.left != null){
			nodes.Add(root.left);
		}
		if(root.right != null){
			nodes.Add(root.right);
		}
		
		serialize(ref nodes, ref result);
		
		return result;
    }
	
	private void serialize(ref List<TreeNode> nodes, ref string result)
	{
		if(nodes.Count == 0){
			return ;
		}
		
		var next = new List<TreeNode>();
		for(var i = 0;i < nodes.Count; i++){
			var n = nodes[i];
			result += "," + n.val;
			if(n.left != null){
				next.Add(n.left);
			}
			if(n.right != null){
				next.Add(n.right);
			}
		}
		
		serialize(ref next, ref result);
	}


    // Decodes your encoded data to tree.
    public TreeNode deserialize(string data) 
	{
		if(string.IsNullOrWhiteSpace(data)){
			return null;
		}
		
		var values = data.Split(',').ToList();
		if(values[0] == "null"){
			return null;
		}
		
		var v = values[0];
		values.RemoveAt(0);
		var root = new TreeNode(int.Parse(v));
        var parents = new Queue<TreeNode>();
		parents.Enqueue(root);
		
		var next = new List<TreeNode>();
		while(parents.Count > 0){
			var p = parents.Dequeue();
			if(values.Count > 0){
				var vLeft = values[0];
				values.RemoveAt(0);
				if(vLeft != "null"){
					p.left = new TreeNode(int.Parse(vLeft));
					next.Add(p.left);
				}
			}
			
			if(values.Count > 0){
				var vRight = values[0];
				values.RemoveAt(0);
				if(vRight != "null"){
					p.right = new TreeNode(int.Parse(vRight));
					next.Add(p.right);
				}
			}
			
			if(parents.Count == 0){
				parents = new Queue<TreeNode>(next);
				next.Clear();
			}
		}
		
		return root;
    }
	
}


相关文章:

  • Ubuntu中用apt安装和卸载软件
  • LeetCode -- Single Number III
  • Linux 常用C函数(内存及字符串操作篇2)
  • LeetCode -- Subsets II
  • WCDMA与CDMA2000网络结构比较
  • LeetCode -- Integer to English Words
  • WiMAX组网技术与解决方案
  • LeetCode -- Sum Root to Leaf Numbers
  • 移动设备管理(MDM)与OMA(OTA)DM协议向导(三)——AAA服务器
  • LeetCode -- Surrounded Regions
  • LeetCode -- Triangle
  • Nebula3中的骨骼动画: Animation子系统
  • LeetCode -- Ugly Number II
  • LeetCode -- Ugly Number
  • vim 显示行号、语法高亮、自动缩进的设置
  • ES6指北【2】—— 箭头函数
  • Android组件 - 收藏集 - 掘金
  • CSS 三角实现
  • java 多线程基础, 我觉得还是有必要看看的
  • js作用域和this的理解
  • LeetCode18.四数之和 JavaScript
  • leetcode98. Validate Binary Search Tree
  • maven工程打包jar以及java jar命令的classpath使用
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Vue ES6 Jade Scss Webpack Gulp
  • Vue学习第二天
  • 解决iview多表头动态更改列元素发生的错误
  • 码农张的Bug人生 - 见面之礼
  • 批量截取pdf文件
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ###C语言程序设计-----C语言学习(6)#
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (C语言)fgets与fputs函数详解
  • (LeetCode) T14. Longest Common Prefix
  • (MATLAB)第五章-矩阵运算
  • (八十八)VFL语言初步 - 实现布局
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (十七)devops持续集成开发——使用jenkins流水线pipeline方式发布一个微服务项目
  • (四)鸿鹄云架构一服务注册中心
  • (学习日记)2024.01.19
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • .NET 5种线程安全集合
  • .NET Framework杂记
  • .NET gRPC 和RESTful简单对比
  • .NET4.0并行计算技术基础(1)
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • @Service注解让spring找到你的Service bean
  • @TableLogic注解说明,以及对增删改查的影响