题目
剑指 Offer 37. 序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/
2 3
/
4 5
序列化为 “[1,2,3,null,null,4,5]”
代码
是在LeetCode上花费时间最长的一道题了…这题二叉树的使用花里胡哨的把👴给整晕了, 要是没路飞我肯定人已经没了(所以还是看了解答吧喂?!!..
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
//现在做题肯定要先处理下边界问题, nuLl首当其冲
if (root == null) {
return new String("[]");
}
StringBuffer ans = new StringBuffer("[");
//先用队列把他们一个一个丢进去
//遍历顺序是root-> left -> right
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
ans.append(root.val + ",");
// ArrayList<Integer> list = new ArrayList<>();
while (!queue.isEmpty() ) {
TreeNode temp = queue.poll();
System.out.println(temp.val);
if (temp.left != null) {
ans.append(temp.left.val + ",");
queue.add(temp.left);
}else{
ans.append("null,");
}
if (temp.right != null) {
ans.append(temp.right.val + ",");
queue.add(temp.right);
}else{
ans.append("null,");
}
}
ans.deleteCharAt(ans.length() - 1);
ans.append("]");
System.out.println(ans.toString());
return ans.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (data.equals("[]")) {
return null;
}
//注意要用substring去除掉首位的[]
//这样就可一步快速获得每个节点的值
String[] vals = data.substring(1, data.length() - 1).split(",");
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int i = 1;
while (!queue.isEmpty()) {
//遇到null不要害怕!微笑的跳过它!
TreeNode node = queue.poll();
if (!vals[i].equals("null")) {
node.left = new TreeNode(Integer.parseInt(vals[i]));
queue.add(node.left);
}
i++;
if (!vals[i].equals("null")) {
node.right = new TreeNode(Integer.parseInt(vals[i]));
queue.add(node.right);
}
i++;
}
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));