【剑指offer】面试题37:序列化二叉树
2017-07-28 16:14
501 查看
题目
请实现两个函数,分别用来序列化和反序列化二叉树思路
使用前序遍历来序列化二叉树,当碰到子节点为null的时候,用特殊字符’$’来表示。ps:也可以使用后序遍历(左->右->根)来做。但是不能使用中序遍历来做(左->根->右),因为使用中序遍历无法确定这棵二叉树。
代码
public class _37_SerializeBinaryTrees { public static class TreeNode { public int val = 0; public TreeNode left = null; public TreeNode right = null; public TreeNode(int val) { this.val = val; } } /** * 序列化 */ public String Serialize(TreeNode root) { if(root == null) return "$"; StringBuilder sb = new StringBuilder(); Serialize(root, sb); return sb.toString(); } private void Serialize(TreeNode root, StringBuilder sb) { if(root == null) { sb.append("$"); return; } sb.append(root.val); Serialize(root.left, sb.append(",")); Serialize(root.right, sb.append(",")); } private int index; /** * 反序列化 */ public TreeNode Deserialize(String str) { if(str == null || str.trim().length() == 0) return null; String[] nums = str.split(","); index = 0; return Deserialize(nums); } public TreeNode Deserialize(String[] nums) { if(nums[index].equals("$")) { ++index; return null; } TreeNode node = new TreeNode(Integer.valueOf(nums[index++])); node.left = Deserialize(nums); node.right = Deserialize(nums); return node; } }
测试
public class _37_Test { public static void main(String[] args) { test1(); test2(); test3(); } /** * 功能测试 * 1.序列化 * 1 * / \ * 2 3 * / / \ * 4 5 6 * * 2.反序列化 */ private static void test1() { TreeNode node1 = new TreeNode(1); TreeNode node2 = new TreeNode(2); TreeNode node3 = new TreeNode(3); TreeNode node4 = new TreeNode(4); TreeNode node5 = new TreeNode(5); TreeNode node6 = new TreeNode(6); node1.left = node2; node1.right = node3; node2.left = node4; node3.left = node5; node3.right = node6; _37_SerializeBinaryTrees sbt = new _37_SerializeBinaryTrees(); String s = sbt.Serialize(node1); // 1,2,4,$,$,$,3,5,$,$,6,$,$ System.out.println(s); TreeNode newRoot = sbt.Deserialize(s); String s2 = sbt.Serialize(newRoot); // 1,2,4,$,$,$,3,5,$,$,6,$,$ System.out.println(s); } /** * 边界测试 * 1.只有左子节点 * 2.只有右子节点 * 3.只有一个节点 */ private static void test2() { _37_SerializeBinaryTrees sbt = new _37_SerializeBinaryTrees(); TreeNode root1 = sbt.Deserialize("1,2,3,$,$,$,$"); System.out.println(sbt.Serialize(root1)); TreeNode root2 = sbt.Deserialize("1,$,2,$,3,$,$"); System.out.println(sbt.Serialize(root2)); TreeNode root3 = sbt.Deserialize("1,$,$"); System.out.println(sbt.Serialize(root3)); } /** * 极端测试 * 1.反序列化时输入空字符串 * 2.序列化时输入null */ private static void test3() { _37_SerializeBinaryTrees sbt = new _37_SerializeBinaryTrees(); TreeNode root = sbt.Deserialize(""); System.out.println(sbt.Serialize(root)); } }
相关文章推荐
- 【剑指Offer】面试题62:序列化二叉树
- 剑指offer——面试题62:序列化二叉树
- 【剑指Offer学习】【面试题62:序列化二叉树】
- 剑指offer 面试题62 序列化和反序列化二叉树
- 剑指offer——面试题62:序列化二叉树
- 剑指offer--面试题62:序列化二叉树
- 剑指Offer面试题62:序列化二叉树
- 剑指Offer-37:序列化二叉树
- 【剑指offer】面试题25:从上往下打印二叉树
- 剑指Offer面试题59:对称二叉树 Java实现
- 【剑指offer】面试题39-二叉树的深度
- 【剑指offer】面试题34:二叉树中和为某一值的路径
- 剑指offer代码解析——面试题19二叉树的镜像
- [剑指offer]面试题19:二叉树的镜像
- 【剑指offer】面试题37:两个链表的第一个公共结点
- 剑指offer_面试题_从上往下打印二叉树
- 剑指offer面试题6 重建二叉树(java实现)
- 剑指offer 面试题23—从上往下打印二叉树
- [剑指offer][面试题25]二叉树中和为某一值得路径
- 【剑指offer】面试题39:深度二叉树