labuladong公众号算法学习笔记
序列化就是把结构化的数据打平,考察二叉树的遍历方式。
前序遍历解法
serialize
在递归遍历两颗子树之前写的代码就是前序遍历代码。
String SEP=",";
String NULL="#";
String serialize(TreeNode root){
StringBuilder sb = new StringBuilder();
serialize(root,sb);
return sb.toString();
}
void serialize(TreeNode root,StringBuilder sb){
if(root == null){
sb.append(NULL).append(SEP);
return;
}
sb.append(root.val).append(SEP);
serialize(root.left,sb);
serailize(root.right,sb);
}
deserialize
可以把字符串转化成列表,因为这里的列表里包含空指针的信息,所以只使用列表就可以还原二叉树了。
先确定根节点root,然后遵循前序遍历的规则,递归生成左右子树即可。
/*主函数,将字符串反序列化为二叉树结构*/
TreeNode deserialize(String data){
//将字符串转化成列表
LinkedList<String> nodes = new LinkedList<>();
for(String s : data.split(SEP);
return deserialize(nodes);
}
TreeNode deserialize(LinkedList<String> nodes){
if(nodes.isEmpty()) return null;
String first = nodes.removeFirst();
if(first.equals(NULL)) return null;
TreeNode root = new TreeNode(Integer.parseInt(first));
root.left = deserialize(nodes);
root.right = deserialize(nodes);
return root;
}
后序遍历解法
serialize
void serialize(TreeNode root,StringBuilder sb){
if(root == null){
sb.append(NULL).append(SEP);
return;
}
serialize(root.left,sb);
serialize(root.right,sb);
sb.append(root.val).append(SEP);
return;
}
deserialize
首先寻找root节点的值,然后递归计算左右子节点。
由列表可知,从后往前在nodes列表中取元素,一定要先构造root.right子树,然后构造root.left子树。
/*主函数,将字符串反序列化为二叉树结构*/
TreeNode deserialize(String data){
//将字符串转化成列表
LinkedList<String> nodes = new LinkedList<>();
for(String s : data.split(SEP);
return deserialize(nodes);
}
TreeNode deserialize(LinkedList<String> nodes){
if(nodes.isEmpty()) return null;
//从后往前取元素
String last = nodes.removeLast();
if(last.equals(NULL)) return null;
TreeNode root = new TreeNode(Integer.parseInt(last));
root.right = deserialize(nodes);
root.left = deserialize(nodes);
return root;
}
层级遍历解法
遍历框架
void traverse(TreeNode root){
if(root == null) return;
//初始化队列加入队伍
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while(!q.isEmpty()){
TreeNode cur = q.poll();
/*层级遍历*/
System.out.println(root.val);
/*层级遍历*/
if(cur.left != null) q.offer(cur.left);
if(cur.right != right) q.offer(cur.right);
}
}