序列化二叉树
序列化二叉树
http://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
采用的是层序遍历的方式:
import java.util.*; public class Solution { // 序列化 String Serialize(TreeNode root) { if (root == null) { return ""; } StringBuilder sb = new StringBuilder(); Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { root = queue.poll(); if (root == null) { sb.append("#!"); } else { sb.append(root.val).append("!"); queue.offer(root.left); queue.offer(root.right); } } return sb.toString(); } // 反序列化 TreeNode Deserialize(String str) { if (str == null || str.length() == 0) return null; String[] a = str.split("!"); int len = a.length; Queue<TreeNode> queue = new LinkedList<>(); TreeNode root = new TreeNode(Integer.valueOf(a[0])); queue.offer(root); int i = 1; while (!queue.isEmpty() && i < a.length) { TreeNode cur = queue.poll(); if ("#".equals(a[i])) { cur.left = null; } else { cur.left = new TreeNode(Integer.valueOf(a[i])); queue.offer(cur.left); } ++i; if ("#".equals(a[i])) { cur.right = null; } else { cur.right = new TreeNode(Integer.valueOf(a[i])); queue.offer(cur.right); } ++i; } return root; } }
知识点:
LinkedList
中元素可以为null
。Integer
的静态方法中,valueOf(String)
返回的是Integer
,而parseInt(String)
返回的是int
,尽量选择无需额外拆装箱的静态方法。StringBuilder
的包是java.lang
,单纯使用它不用额外import
。String
的split
方法:
s.split("!")为例: "" -> [""] "1" -> ["1"] "1!2" -> ["1", "2"] "1!2!" -> ["1", "2"] "1!2!!!!" -> ["1", "2"] "!1!2!" -> ["", "1", "2"] "!!!1!2!" -> ["", "", "", "1", "2"] "1!!2" -> ["1", "", "2"] "1!!!2" -> ["1", "", "", "2"]
可见,
- 不含分隔符的源字符串处理完成后,是长度为1的字符串数组,元素就是源字符串。
- 结尾的多余的分隔符不影响结果。
- 开头和中间的多余的分隔符会影响结果。