题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
import java.util.*;
public class Solution {
StringBuilder str = new StringBuilder("");
String Serialize(TreeNode root) {
if(root == null)
str.append("#!");
else{//别掉了这个
str.append(root.val + "!");
Serialize(root.left);
Serialize(root.right);
}
return str.toString();
}
TreeNode Deserialize(String str) {
String s = "";
String[] arr = str.split("!");
return createTree(null,arr);
}
int index = 0;
public TreeNode createTree(TreeNode node,String[] arr){
String data = arr[index++];//注意:index的值
if("#".equals(data)){
node = null;
}else{
Integer val = Integer.valueOf(data);
node = new TreeNode(val);
node.left = createTree(node.left,arr);
node.right = createTree(node.right,arr);
}
return node;
}
}
null也要加上一个“!”符号.为了后面容易使用split()函数。
注:传入了一个重要的参数值—null。若为null创建一个值,返回,由于是前序遍历,所以返回这个根节点就好,若不是null的话,创建它的左右节点,并将其赋值给左右节点。
在if下没有返回值的时候,不要轻易接着写,应该多考虑使用else
层次遍历:
static TreeNode buildTree(ArrayList arr){
int index = 0;
TreeNode root = new TreeNode((int)arr.get(index++));
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode tmp = queue.poll();
Object o = arr.get(index++);
if(o.equals("null")){
tmp.left = null;
}else
tmp.left = new TreeNode((int)o);
o = arr.get(index++);
if("null".equals(o)){
tmp.right = null;
}else
tmp.right = new TreeNode((int)o);
if(tmp.left != null)
queue.offer(tmp.left);
if(tmp.right != null)
queue.offer(tmp.right);
}
return root;
}
static ArrayList order(TreeNode root){
ArrayList arr = new ArrayList();
Queue<TreeNode> queue = new LinkedList<>();
arr.add(root.val);//注意arr添加的位置
queue.offer(root);
while(!queue.isEmpty()){
TreeNode tmp = queue.poll();
//不是在这里
if(tmp.left != null){
arr.add(tmp.left.val);
queue.offer(tmp.left);
}else
arr.add("null");//因为需要添加"null"字符串
if(tmp.right != null){
arr.add(tmp.right.val);
queue.offer(tmp.right);
}else
arr.add("null");
}
return arr;
}
public static void main(String[] args) {
ArrayList arr = new ArrayList();
arr.add(10); arr.add(5); arr.add(-3);
arr.add(3); arr.add(2); arr.add("null");
arr.add(11); arr.add(3); arr.add(-2);
arr.add("null"); arr.add(1); arr.add("null");arr.add("null");
arr.add("null");arr.add("null"); arr.add("null");arr.add("null"); arr.add("null");arr.add("null");
TreeNode root = buildTree(arr);
arr = order(root);
System.out.println(arr);
}
所以,知道,层次遍历既可以在入队前也可以在入队后收集非null的数据,如果要收集null的数据,那么必须在入队之前,因为null数据是不会入队的。