剑指Offer题目:序列化二叉树
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
解题思路
思路:
(1) 层序遍历思路
(2)先序遍历思路
完整代码
import java.util.LinkedList;
public class q62_Serialize_序列化二叉树 {
//层序遍历思路
String Serialize1(TreeNode root) {
StringBuilder sb = new StringBuilder();
if (root == null) return "";
LinkedList<TreeNode> queue = new LinkedList();
queue.add(root);
while (queue.size() != 0) {
TreeNode node = queue.poll();
if (node == null) sb.append("#");
else {
sb.append(String.valueOf(node.val));
queue.add(node.left);
queue.add(node.right);
}
sb.append("!");
}
return sb.toString();
}
//层序遍历思路
TreeNode Deserialize1(String str) {
if (str == null || str.length() == 0) return null;
String[] ss = str.split("!");
LinkedList<TreeNode> queue = new LinkedList();
TreeNode root = new TreeNode(Integer.valueOf(ss[0]));
int len = ss.length;
int index = 1;
queue.add(root);
while (queue.size() != 0 && index < len) {
TreeNode node = queue.poll();
if (node == null) continue;
String temp = ss[index++];
if (temp.equals("#")) node.left = null;
else
node.left = new TreeNode(Integer.valueOf(temp));
queue.offer(node.left);
temp = ss[index++];
if (temp.equals("#")) node.right = null;
else
node.right = new TreeNode(Integer.valueOf(temp));
queue.offer(node.right);
}
return root;
}
//先序遍历思路
String Serialize2(TreeNode root) {
if (root == null) return "";
return preOrder(root);
}
//先序遍历思路
private String preOrder(TreeNode root) {
if (root == null) return "#!";
StringBuilder sb = new StringBuilder(String.valueOf(root.val) + "!");
sb.append(preOrder(root.left));
sb.append(preOrder(root.right));
return sb.toString();
}
//先序遍历思路
TreeNode Deserialize2(String str) {
if (str == null || str.length() == 0) return null;
LinkedList<String> queue = new LinkedList<String>();
String[] ss = str.split("!");
for (String s : ss) queue.offer(s);
return buildTree(queue);
}
//先序遍历思路
private TreeNode buildTree(LinkedList<String> queue) {
String temp = queue.poll();
if (temp.equals("#")) return null;
TreeNode node = new TreeNode(Integer.valueOf(temp));
node.left = buildTree(queue);
node.right = buildTree(queue);
return node;
}
}
更多LeetCode题目及答案解析见GitHub: https://github.com/on-the-roads/LeetCode
剑指offer题目及答案解析:https://github.com/on-the-roads/SwordToOffer