差不多搞了两个半小时,终于出来了,目前最大的问题是 在LeetCode上不停的调试和试错,才能得出最终答案,在敲代码的过程中会犯各种各样的毛病,而且对二叉树的序列化不是很清楚,判别条件上也总是出错,总之就是很菜
使用的是层序遍历,也就是BFS
/**
* 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) {
if(root==null){
return null;
}
StringBuilder sb=new StringBuilder();
Deque<TreeNode> deque=new LinkedList<>();
deque.add(root);
sb.append(root.val+",");
while(deque.size()!=0){
int size=deque.size();
for(int i=0;i<size;i++){
TreeNode node=deque.poll();
if(node.left!=null){
deque.add(node.left);
sb.append(node.left.val+",");
}else{
// deque.add(new TreeNode(1));
sb.append("#"+",");
}
if(node.right!=null){
deque.add(node.right);
sb.append(node.right.val+",");
}else{
// deque.add(new TreeNode(1));
sb.append("#"+",");
}
}
if(count==fbei){
break;
}
count=0;
}
// System.out.print(count);
System.out.print(sb.substring(0,sb.length()-count*2-1));
return sb.substring(0,sb.length());
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data==null){
return null;
}
String[] str=data.split(",");
if(str.length==0){
return null;
}
TreeNode ref=new TreeNode(Integer.valueOf(str[0]));
TreeNode tree=ref;
int start=1;
Deque<TreeNode> deque=new LinkedList<>();
deque.add(ref);
while(start<str.length&&deque.size()!=0){
TreeNode node=deque.poll();
if(start<str.length&&!str[start].equals("#")){
node.left=new TreeNode(Integer.valueOf(str[start]));
deque.add(node.left);
}
start++;
if(start<str.length&&!str[start].equals("#")){
flag=true;
node.right=new TreeNode(Integer.valueOf(str[start]));
deque.add(node.right);
}
start++;
}
return tree;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
深度遍历代码
/**
* 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 StringBuilder rserialize(TreeNode root,StringBuilder sb){
if(root==null){
sb.append("#,");
return sb;
}
sb.append(root.val+",");
rserialize(root.left,sb);
rserialize(root.right,sb);
return sb;
}
public String serialize(TreeNode root) {
return rserialize(root,new StringBuilder()).toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if((data.charAt(0)+"").equals("#")){
return null;
}
String[] str=data.split(",");
List<String> list=new ArrayList<>(Arrays.asList(str));
return rdeserialize(list);
}
public TreeNode rdeserialize(List<String> list){
if(list.get(0).equals("#")){
list.remove(0);
return null;
}
TreeNode root=new TreeNode(Integer.valueOf(list.get(0)));
list.remove(0);
root.left=rdeserialize(list);
root.right=rdeserialize(list);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));