【剑指Offer学习】【面试题62:序列化二叉树】
题目:请实现两个函数,分别用来序列化和反序列化二叉树。
解题思路
通过分析解决前面的面试题6.我们知道能够从前序遍历和中序遍历构造出一棵二叉树。受此启示。我们能够先把一棵二叉树序列化成一个前序遍历序列和一个中序序列。然后再反序列化时通过这两个序列重构出原二叉树。
这个思路有两个缺点。一个缺点是该方法要求二叉树中不能用有数值反复的结点。
另外仅仅有当两个序列中全部数据都读出后才干開始反序列化。
假设两个遍历序列的数据是从一个流里读出来的,那就可能须要等较长的时间。
实际上假设二叉树的序列化是从根结点開始的话,那么对应的反序列化在根结点的数值读出来的时候就能够開始了。因此我们能够依据前序遍历的顺序来序列化二叉树。由于前序遍历是从根结点開始的。
当在遍历二叉树碰到NULL指针时,这些NULL指针序列化成一个特殊的字符(比方‘$’)。
另外,结点的数值之间要用一个特殊字符(比方’,’)隔开。
结点定义
private static class BinaryTreeNode {
private int val;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode() {
}
public BinaryTreeNode(int val) {
this.val = val;
}
@Override
public String toString() {
return val + "";
}
}
代码实现
import java.util.LinkedList;
import java.util.List;
public class Test62 {
private static class BinaryTreeNode {
private int val;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode() {
}
public BinaryTreeNode(int val) {
this.val = val;
}
@Override
public String toString() {
return val + "";
}
}
public static void serialize(BinaryTreeNode root, List<Integer> result) {
List<BinaryTreeNode> list = new LinkedList<>();
list.add(root);
BinaryTreeNode node;
while (list.size() > 0) {
node = list.remove(0);
if (node == null) {
result.add(null);
}else {
result.add(node.val);
list.add(node.left);
list.add(node.right);
}
}
}
public static BinaryTreeNode deserialize(List<Integer> result, int idx) {
if (result.size() < 1 || idx < 0 || result.size() <= idx || result.get(idx) == null) {
return null;
}
BinaryTreeNode root = new BinaryTreeNode(result.get(idx));
root.left = deserialize(result, idx * 2 + 1);
root.right = deserialize(result, idx * 2 + 2);
return root;
}
public static void main(String[] args) {
test01();
}
private static void test01() {
BinaryTreeNode n1 = new BinaryTreeNode(1);
BinaryTreeNode n2 = new BinaryTreeNode(2);
BinaryTreeNode n3 = new BinaryTreeNode(3);
BinaryTreeNode n4 = new BinaryTreeNode(4);
BinaryTreeNode n5 = new BinaryTreeNode(5);
BinaryTreeNode n6 = new BinaryTreeNode(6);
BinaryTreeNode n7 = new BinaryTreeNode(7);
BinaryTreeNode n8 = new BinaryTreeNode(8);
BinaryTreeNode n9 = new BinaryTreeNode(9);
n1.left = n2;
n1.right = n3;
n2.left = n4;
n2.right = n5;
n3.left = n6;
n3.right = n7;
n4.left = n8;
n4.right = n9;
List<Integer> result = new LinkedList<>();
serialize(n1, result);
System.out.println(result);
System.out.println();
BinaryTreeNode root = deserialize(result, 0) ;
print(root);
}
private static void print(BinaryTreeNode root) {
if (root != null) {
print(root.left);
System.out.printf("%-3d", root.val);
print(root.right);
}
}
}
执行结果
特别说明
欢迎转载。转载请注明出处【http://blog.csdn.net/DERRANTCM/article/details/46857985】
【剑指Offer学习】【面试题62:序列化二叉树】的更多相关文章
- 《剑指offer》面试题37. 序列化二叉树
问题描述 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 你可以将以下二叉树: 1 / \ 2 3 / \ 4 5 序列化为 "[1,2,3,null,null,4,5]&quo ...
- 《剑指offer》面试题62. 圆圈中最后剩下的数字
问题描述 0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字. 例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删除第 ...
- (剑指Offer)面试题25:二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 二叉树结点的定义: struct TreeNode ...
- (剑指Offer)面试题19:二叉树的镜像
题目: 操作给定的二叉树,将其变换为源二叉树的镜像. 二叉树的定义如下: struct TreeNode{ int val; TreeNode* left; TreeNode* right; }; 输 ...
- 【剑指offer】面试题39:二叉树的深度
题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 思路: 根的深度=MAX(左子树深度,右子树深度)+1; Code: ...
- 【剑指offer】面试题25:二叉树中和为某一值的路径
题目: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. 思路: dfs一下就可以了.一般dfs肯定递归写比 ...
- (剑指Offer)面试题58:二叉树的下一个结点
题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 考虑中序遍历的过程, 如果当前结点存在右子节点, ...
- (剑指Offer)面试题39:二叉树的深度
题目: 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 结点的定义如下: struct TreeNode{ int val; ...
- 剑指offer笔记面试题7----重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如,输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列 ...
- 《剑指offer》面试题6 重建二叉树 Java版
(由一个二叉树的前序和中序序列重建一颗二叉树) 书中方法:我们要重建一棵二叉树,就要不断地找到根节点和根节点的左子结点和右子节点.注意前序序列, 它的第一个元素就是二叉树的根节点,后面的元素分为它的左 ...
随机推荐
- Android系统默认语言改为中文
第一种方法: 修改 build/tools/buildinfo.sh echo "ro.product.locale.language=zh"echo "ro.produ ...
- 四、 java循环结构
for循环结构: 格式:①初始化条件;②循环条件;③迭代条件;④循环体 for(①;②;③){ //④ } 执行过程:①-②-④-③-②-④-③-...-④-③-②,直至循环条件不满足,退出当前的循环 ...
- CMake安装或CMake Error at CMakeLists
CMake安装或CMake Error at CMakeLists 发生情景: 使用cmake命令安装软件时,报如下错误: CMake Error at CMakeLists.txt:4 (CMAKE ...
- Servlet 2.4 规范之第四篇:Servlet上下文
SRV.3.1 ServletContext接口说明 ServletContext接口定义了运行servlet的web应用中和servlet相关的视图信息.容器提供者负责提供ServletCon ...
- AC日记——旅行 洛谷 P3313
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我 ...
- mysql InnoDb存储引擎索引
B+树索引:使用B+树索引查找数据时,并不能找到一个给定键值的具体行,只是找到被查找数据行所在的页,然后数据库通过把页读取到内存,再在内存中进行查找,最后得到要查找的数据. 聚集索引:按照表中主键构造 ...
- python--文件处理1
1. 读取文件 方法: all_the_text = open('thefile.txt').read() 但是为了安全起见还是给打开的文件对象指定一个名字,这样在完成之后可以迅速关掉,防止无 ...
- Spring异步任务处理,@Async的配置和使用
本文转自http://blog.csdn.net/clementad/article/details/47403185 感谢作者 这个注解用于标注某个方法或某个类里面的所有方法都是需要异步处理的.被注 ...
- CentOS 笔记
对安装CentOS安装使用过程中的问题做一个笔记,第一次安装,安装的是7.0版本,最小化安装. 安装环境 :Windows 2012 R2 Standard,Hyper-V Virstual Mach ...
- Xcode: This device is no longer connected error
Quit the xcode and connect again will all right.