题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
这里给出层序遍历和前序遍历两种解法(一种非递归,一种递归)
层序遍历
String Serialize2(TreeNode root) {
StringBuilder str = new StringBuilder("");
if(root == null) return str.toString();
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int count = 1;
while(count > 0){
TreeNode node = queue.poll();
if(node == null) str.append("#,");
else {
count--;
str.append(node.val+",");
if(node.left != null) count++;
queue.add(node.left);
if(node.right != null) count++;
queue.add(node.right);
}
}
return str.toString();
}
TreeNode Deserialize2(String str) {
if("".equals(str)) return null;
String[] chs = str.split(",");
int length = chs.length;
Queue<TreeNode> queue = new LinkedList<>();
TreeNode root = new TreeNode(Integer.parseInt(chs[0]));
queue.add(root);
int i = 1;
while(!queue.isEmpty() && i < chs.length){
TreeNode node = queue.poll();
String left = chs[i++];
if(!"#".equals(left)){
TreeNode newNode = new TreeNode(Integer.parseInt(left));
node.left = newNode;
queue.add(newNode);
}
if(i < chs.length){
String right = chs[i++];
if(!"#".equals(right)) {
TreeNode newNode = new TreeNode(Integer.parseInt(right));
node.right = newNode;
queue.add(newNode);
}
}
}
return root;
}
前序遍历(递归)
String Serialize(TreeNode root) {
StringBuilder builder = new StringBuilder();
if(root == null){
return builder.append("#,").toString();
}
builder.append(root.val+",").append(Serialize(root.left)).append(Serialize(root.right));
return builder.toString();
}
int now = 0;
TreeNode Deserialize(String str) {
String[] strs = str.split(",");
if(now >= strs.length) return null;
if("#".equals(strs[now])){
now++;
return null;
}
TreeNode node = new TreeNode(Integer.parseInt(strs[now]));
now++;
node.left = Deserialize(str);
node.right = Deserialize(str);
return node;
}