请实现两个函数,分别用来序列化和反序列化二叉树。
示例:
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
BFS+位置指针(队列、递归2种解法):
队列:
递归:
注意:递归序列化出来的序列和队列方式结果不同,递归返回的列表数据更像DFS遍历的结果,虽然两者序列化和反序列化的方式不同,但不影响构建结果。即怎么序列化,就怎么反序列化
初始化:res列表,index指针
序列化递归:
self.serhelper(root.left)
,之后开启右子树遍历self.serhelper(root.right)
反序列化递归:
node.left = self.deshelper(data)
和node.right = self.deshelper(data)
/**
* 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 "[]";
StringBuilder res = new StringBuilder("[");
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode temp = queue.poll();
if(temp!=null){
res.append(temp.val+",");
queue.add(temp.left);
queue.add(temp.right);
}
else
res.append("null,");
}
res.deleteCharAt(res.length()-1);
res.append("]");
return res.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.equals("[]")) return null;
String[] origin = data.substring(1,data.length()-1).split(",");
TreeNode root = new TreeNode(Integer.parseInt(origin[0]));
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int index = 1;
while(!queue.isEmpty()){
TreeNode temp = queue.poll();
if(!origin[index].equals("null")){
temp.left = new TreeNode(Integer.parseInt(origin[index]));
queue.add(temp.left);
}
index++;
if(!origin[index].equals("null")){
temp.right = new TreeNode(Integer.parseInt(origin[index]));
queue.add(temp.right);
}
index++;
}
return root;
}
}
// 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.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
def __init__(self):
self.res = []
self.index = 0
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
if not root: return []
self.serhelper(root)
return self.res
def serhelper(self,root):
if not root:
self.res.append("null")
return
self.res.append(root.val)
self.serhelper(root.left)
self.serhelper(root.right)
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if not data: return []
return self.deshelper(data)
def deshelper(self,data):
if data[self.index] == "null":
self.index+=1
return None
node = TreeNode(data[self.index])
self.index+=1
node.left = self.deshelper(data)
node.right = self.deshelper(data)
return node
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))