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 public class Codec { private int pos; public String serialize (TreeNode root) { StringBuilder ans = new StringBuilder (); serial(root, ans); return ans.toString(); } private void serial (TreeNode node, StringBuilder str) { if (node == null ) { str.append("#" ); str.append("," ); return ; } str.append(String.valueOf(node.val)); str.append("," ); serial(node.left, str); serial(node.right, str); } public TreeNode deserialize (String data) { String[] nodes = data.split("," ); return deserial(nodes); } private TreeNode deserial (String[] nodes) { if (nodes[pos].equals("#" )) { pos += 1 ; return null ; } TreeNode currNode = new TreeNode (Integer.parseInt(nodes[pos++])); currNode.left = deserial(nodes); currNode.right = deserial(nodes); return currNode; } }
preorder traversal. 我们用,来隔开不同的node, 用#表示null. 想明白这道题, 也就明白construct binary tree from preorder and inorder traversal那道题了. 这里我们还原一个node, 就让pos加1, 这样方便后面的递归函数, 它们可以直接就调用, 不需要再更新pos.
注意39行那里不能直接在中括号里面++, 因为如果这行if条件没有成立, pos也会++, 这不是我们想要的.
时间复杂度: O(n) 空间复杂度: O(n)