2017.9.14
就是一个问题,当把一串数字转化为字符串的时候,不可能单纯地toString。
获取某个数字的时候也不能单纯地str.charAt()
因为数字不一定都是个位数。这个错误以前就犯过,今天又犯了。
/**
* Definition of TreeNode:
* public class TreeNode {
* public int val;
* public TreeNode left, right;
* public TreeNode(int val) {
* this.val = val;
* this.left = this.right = null;
* }
* }
*/
public class Solution {
/**
* This method will be invoked first, you should design your own algorithm
* to serialize a binary tree which denote by a root node to a string which
* can be easily deserialized by your own "deserialize" method later.
*/
public static String serialize(TreeNode root) {
// write your code here
// 就采用层次遍历的方法吧。其实将树构造成一棵完全二叉树,就好办了。。
String data = "";
if(root == null){
data = "# ";
return data;
}
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
queue.addFirst(root);
int flag = 1;
while(root != null || !queue.isEmpty()){
root = queue.pollLast();
if(root.val == -1){
data = data + "# ";
}
else{
data = data + Integer.toString(root.val) + " ";
flag--;
}
if(root.left == null){
TreeNode tmp = new TreeNode(-1);
queue.addFirst(tmp);
}
else{
queue.addFirst(root.left);
flag++;
}
if(root.right == null){
TreeNode tmp = new TreeNode(-1);
queue.addFirst(tmp);
}
else{
queue.addFirst(root.right);
flag++;
}
if(flag <=0){
break;
}
}
return data;
}
/**
* This method will be invoked second, the argument data is what exactly
* you serialized at method "serialize", that means the data is not given by
* system, it's given by your own serialize method. So the format of data is
* designed by yourself, and deserialize it here as you serialize it in
* "serialize" method.
*/
public static TreeNode deserialize(String data) {
// write your code here
int size = data.length();
if(size <= 0 || data.charAt(0) == '#'){
return null;
}
String []arr = data.split(" ");
TreeNode root = new TreeNode(Integer.valueOf(arr[0]));
TreeNode bt = root;
LinkedList<TreeNode> res = new LinkedList<TreeNode>();
res.addFirst(root);
int i = 1;
while(i < arr.length){
if(arr[(i-1)/2].equals("#")){
i = i+2;
continue;
}
bt = res.pollLast();
if(!arr[i].equals("#")){
bt.left = new TreeNode(Integer.valueOf(arr[i]));
res.addFirst(bt.left);
}
i++;
if(i < arr.length && !arr[i].equals("#")){
bt.right = new TreeNode(Integer.valueOf(arr[i]));
res.addFirst(bt.right);
}
i++;
}
return root;
}
}