剑指 Offer.37-序列化二叉树
剑指 Offer.37-序列化二叉树
题目链接
剑指 Offer 37. 序列化二叉树
问题描述
请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人解法(层序遍历)
此题有坑点,题目中给出的测试用例会干扰解题思路,曾尝试通过层序遍历完成二叉树的序列化为测试用例的格式,但该种格式较难用于反序列化,于是尝试将所有树的叶子节点也包括在序列化字符串中。
在反序列化时,使用队列,同时扫描数组,重新构建二叉树
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
public class Codec { public String serialize(TreeNode root) { StringBuffer sb = new StringBuffer("["); Queue<TreeNode> queue = new LinkedList<>(); if(root == null) return "[]"; queue.offer(root); while(!queue.isEmpty()){ TreeNode t = queue.poll(); if(t != null){ sb.append(t.val + ","); queue.offer(t.left); queue.offer(t.right); }else{ sb.append("null,"); } } sb.deleteCharAt(sb.length()-1); sb.append("]"); return sb.toString(); }
public TreeNode deserialize(String data) { if(data.equals("[]")) return null; String[] s = data.substring(1,data.length()-1).split(","); TreeNode root = new TreeNode(Integer.parseInt(s[0])); Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); int i = 1; while(!queue.isEmpty()){ TreeNode element = queue.poll(); if(!s[i].equals("null")){ element.left = new TreeNode(Integer.parseInt(s[i])); queue.offer(element.left); } i++; if(!s[i].equals("null")){ element.right = new TreeNode(Integer.parseInt(s[i])); queue.offer(element.right); } i++; } return root; } }
|