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

面试算法48:序列化和反序列化二叉树

题目

请设计一个算法将二叉树序列化成一个字符串,并能将该字符串反序列化出原来二叉树的算法。

分析

先考虑如何将二叉树序列化为一个字符串。需要逐个遍历二叉树的每个节点,每遍历到一个节点就将节点的值序列化到字符串中。以前序遍历的顺序遍历二叉树最适合序列化。如果采用前序遍历的顺序,那么二叉树的根节点最先序列化到字符串中,然后是左子树,最后是右子树。这样做的好处是在反序列化时最方便,从字符串中读出的第1个数值一定是根节点的值。

实际上,只把节点的值序列化到字符串中是不够的。首先,要用一个分隔符(如逗号)把不同的节点分隔开。其次,还要考虑如何才能在反序列化的时候构建不同结构的二叉树。

在这里插入图片描述
尽管null节点通常没有在图上画出来,但它们对树的结构是至关重要的。因此,应该把null节点序列化成一个特殊的字符串。如果把null节点序列化成"#“,那么图8.3(a)中的二叉树用前序遍历将被序列化成字符串"6,6,6,#,#,6,#,#,6,#,#”,而图8.3(b)中的二叉树将被序列化成字符串"6,6,#,#,6,6,#,#,6,#,#"。

public class Test {public static void main(String[] args) {TreeNode node6 = new TreeNode(6);TreeNode node66 = new TreeNode(6);TreeNode node666 = new TreeNode(6);TreeNode node6666 = new TreeNode(6);TreeNode node66666 = new TreeNode(6);node6.left = node66;node6.right = node666;node66.left = node6666;node66.right = node66666;String result = serialize(node6);System.out.println(result);TreeNode deserialize = deserialize(result);System.out.println(deserialize);}public static String serialize(TreeNode root) {if (root == null) {return "#";}String leftStr = serialize(root.left);String rightStr = serialize(root.right);return root.val + "," + leftStr + "," + rightStr;}public static TreeNode deserialize(String data) {String[] nodeStrs = data.split(",");int[] array = {0};return dfs(nodeStrs, array);}private static TreeNode dfs(String[] strs, int[] array) {String str = strs[array[0]];array[0]++;if (str.equals("#")) {return null;}TreeNode node = new TreeNode(Integer.valueOf(str));node.left = dfs(strs, array);node.right = dfs(strs, array);return node;}
}
http://www.lryc.cn/news/218698.html

相关文章:

  • 【Python基础】Python编程入门自学笔记,基础大全,一篇到底!
  • windows自动登陆
  • 5G及其后的5G非地面网络:趋势和研究挑战-HARQ部分
  • 【WPF系列】- XAML语法规范
  • antv/g6之图布局及切换布局
  • Wordpress plugin removes ‘/category‘
  • 【大数据基础平台】星环TDH社区集群版本部署
  • 【Java】汉诺塔
  • Java实现对Html文本的处理
  • Vue项目创建与启动(2023超详细的图文教程)
  • EtherCAT主站读取从站EEPROM抓包分析
  • Elasticsearch 8.X 如何生成 TB 级的测试数据 ?
  • 汽车标定技术(四)--问题分析:多周期测量时上位机显示异常
  • Flink SQL时间属性和窗口介绍
  • Tomcat免安装版修改标题名称和进程
  • vim搜索、替换tab
  • 一文读懂ARM安全性架构和可信系统构建要素
  • Voice vlan、ICMP、单臂路由、mux-vlan
  • TCP IP 网络编程(七) 理解select和epoll的使用
  • Linux accept和FD_xxx的使用
  • 树结构及其算法-二叉运算树
  • vue的rules验证失效,部分可以部分又失效的原因
  • c#字符串转整数类型
  • 【LeetCode】118. 杨辉三角
  • 【Vue.js】Vue3全局配置Axios并解决跨域请求问题
  • 【车载开发系列】CRC循环冗余校验码原理
  • 数据库实验:SQL的数据更新
  • 3.线性神经网络-3GPT版
  • 大语言模型对齐技术 最新论文及源码合集(外部对齐、内部对齐、可解释性)
  • x264交叉编译(ubuntu+arm)