Serialize and deserilize a binary Tree
WAP 线上面试题 livecoding
Design an algorithm to serialize and deserialize a binary tree, in which the tree can be serialized to a list of Integer and this list can be deserilized to the original tree structure.
并不是leetcode原题,是层序遍历。
一般的是序列化为String,如果是序列化为String,就需要在 node之间插入’!’ 表示结束。
然后’#’表示null。
但本题是list,思想类似,不过处理null有点麻烦.
live coding的时候紧张lol, 面试官都给tips,序列化和反序列化都是层序化,反序列化注意root要先存到queue,按顺序赋给left 和right即可。
代码如下:
package worksExam;
import java.util.*;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val){
this.val=val;
}
}
public class Main {
public List<Integer> serialize(TreeNode root){
List<Integer> list=new ArrayList<Integer>();
if(root==null)
return list;
LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
queue.add(root);
while(queue.isEmpty()==false){
TreeNode treeNode=queue.peek();
queue.remove();
/** -1 表示该节点是null!
* 如果是表示null,加入null到list,
* 下面就不要执行了,直接continue到下一次remove。
* 否则就会进入死循环,所以后面不会有的就continue!
* */
if(treeNode.val!=-1){
list.add(treeNode.val);
}else{
list.add(null);
continue;
}
if(treeNode.left!=null){
queue.add(treeNode.left);
}
else{
queue.add(new TreeNode(-1));
}
if(treeNode.right!=null){
queue.add(treeNode.right);
}
else{
queue.add(new TreeNode(-1));
}
}
return list;
}
public TreeNode deserialize(List<Integer> data){
if(data.size()<1||data==null)
return null;
//root
LinkedList<TreeNode> queue=new LinkedList<TreeNode>();
TreeNode root=new TreeNode(data.get(0));
int index=0;
queue.add(root);
TreeNode node=null;
while(!queue.isEmpty()){
node=queue.remove();
if(data.get(++index)!=null)
node.left=new TreeNode(data.get(index));
if(data.get(++index)!=null)
node.right=new TreeNode(data.get(index));
if(node.left!=null){
queue.add(node.left);
}
if(node.right!=null){
queue.add(node.right);
}
}
return root;
}
}