public class Codec { // 这个数不只是个位数 还可能是负数等等 不单纯把他看作个位数 或者整数 // Encodes a tree to a single string. public String serialize(TreeNode root) { StringBuffer sbf = new StringBuffer(""); dfs1(root, sbf); return sbf.toString(); } public void dfs1(TreeNode root, StringBuffer sbf) { if (root == null) { sbf.append("#,"); return; } sbf.append(root.val + ","); dfs1(root.left, sbf); dfs1(root.right, sbf); } public TreeNode deserialize(String data) { StringBuilder builder = new StringBuilder(data); return deserial(builder); } private TreeNode deserial(StringBuilder data) { int index = data.indexOf(","); // index存储第一个逗号出现的索引值 String current = ""; // current存储当前要够构造的节点的val值 if (index == -1) { // index为-1,说明不存在逗号,针对此对data作切割 index = data.length(); current = data.toString(); data = data.delete(0, index); } else { // index为-1,说明存在逗号,针对此对data作切割 current = data.substring(0, index); data = data.delete(0, index + 1); } if (current.length() > 0 && !current.equals("#")) { // 存在值,可以构建节点 TreeNode root = new TreeNode(Integer.parseInt(current)); root.left = deserial(data); root.right = deserial(data); return root; } else { // 不存在值,返回null return null; } } }
java与c++不同,java只存在值传递,不存在引用传递,不存在指针,所以,完全照搬c++用指针的方式(剑指offer第37题)来做是不行的,需要做变通。所以,在此我尝试用StringBuilder(不能直接用String,因为String是不可变对象,是被final修饰的,每次对String修改,都会创建一个新的String)来解决,也可以尝试用List,String[]数组等方式,不过需要考虑索引的问题。具体看代码注释