序列化:利用BFS层序遍历二叉树,节点与节点之间用 , 隔开;如果遇到空节点,则使用字母 X 代替,最终以字符串返回
反序列化:将序列化串,根据 , 分隔并保存在一个队列中;同时创建一个树节点的队列用来遍历到每层节点;遍历过程中,每次取出根节点和它可能的左右节点,然后判断这两个左右节点是否为 X ,如果是,则跳过说明为空节点;如果不是则加入其对应左右节点处,并加入队列中。
代码实现(java)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/publicclassCodec{// Encodes a tree to a single string.publicStringserialize(TreeNode root){if(root ==null)return"";StringBuilder sb =newStringBuilder();Queue<TreeNode> queue =newLinkedList<>();
queue.offer(root);while(queue.size()>0){TreeNode node = queue.poll();if(node ==null){
sb.append("X").append(",");continue;}
sb.append(node.val).append(",");
queue.offer(node.left);
queue.offer(node.right);}return sb.toString();}// Decodes your encoded data to tree.publicTreeNodedeserialize(String data){if(data =="")returnnull;Queue<String> nodeQueue =newLinkedList<>(Arrays.asList(data.split(",",-1)));Queue<TreeNode> rootQueue =newLinkedList<>();TreeNode root =newTreeNode(Integer.parseInt(nodeQueue.poll()));
rootQueue.offer(root);while(!rootQueue.isEmpty()){TreeNode rootN = rootQueue.poll();String left = nodeQueue.poll();String right = nodeQueue.poll();if(!"X".equals(left)){
rootN.left =newTreeNode(Integer.parseInt(left));
rootQueue.offer(rootN.left);}if(!"X".equals(right)){
rootN.right =newTreeNode(Integer.parseInt(right));
rootQueue.offer(rootN.right);}}return root;}}// Your Codec object will be instantiated and called as such:// Codec ser = new Codec();// Codec deser = new Codec();// TreeNode ans = deser.deserialize(ser.serialize(root));