剑指Offer–序列化二叉树(层序遍历BFS)
请实现两个函数,分别用来序列化和反序列化二叉树。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
public String serialize(TreeNode root){
if(root == null) return "[]";//特例为空
StringBuilder res = new StringBuilder("[");//建立字符串生成器,
Queue<TreeNode> queue = new LinkedList<>() {{add(root); }};//创建队列,用LinkedList实现,并添加根节点
while (!queue .isEmpty() ){
TreeNode node = queue.poll();/*Queue中remove() 和 poll() 都是用来从队列头部删除一个元素。
在队列元素为空的情况下,remove()方法会抛出NoSuchElementException异常,poll() 方法只会返回null*/
if(node != null) {
res.append(node.val+",");
queue.add(node.left);//在本题中队列中是可以添加null的
queue.add(node.right);
}//通常的层序遍历方式,弹出一个节点,加入其左右节点
else res.append("null.");//这里是为了给二叉树的叶节点的孩子添加null
}
res.deleleCharAt(res.length() -1 );//删除最后一个null的逗号
res.append("]");
return res.toString();//将StringBuilder转换成String
}
public TreeNode deserialize(String data) {
if(data.equals("[]")) return null;
String[] vals = data.substring(1, data.length() - 1).split(",");//去掉【】,并且以逗号分隔字符串
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));//这里应该自动拆包,将Integer包装类转换成基本数据类型Int
Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }};
int i = 1;
while(!queue.isEmpty()) {
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;
}
}
感谢力扣K神带刷🗡指offer!