题目描述:请实现两个函数,分别用来序列化和反序列化二叉树
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
思路一:
根据前序遍历规则完成序列化与反序列化。
所谓序列化指的是遍历二叉树为字符串;依据前序遍历序列来序列化二叉树,因为前序遍历序列是从根结点开始的。当在遍历二叉树时碰到Null指针时,这些Null指针被序列化为一个特殊的字符“#”。 另外,结点之间的数值用逗号隔开。
所谓反序列化指的是依据字符串重新构造成二叉树。
public class Solution {
public int i = -1;
String Serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
if (root == null)
{
sb.append("#,");
return sb.toString();
}
sb.append(root.val + ",");
sb.append(Serialize(root.left));
sb.append(Serialize(root.right));
return sb.toString();
}
TreeNode Deserialize(String str) {
i++;
int len = str.length();
if (i >= len)
return null;
String[] strings = str.split(",");
TreeNode node = null;
if (!strings[i].equals("#"))
{
node = new TreeNode(Integer.valueOf(strings[i]));
node.left = Deserialize(str);
node.right = Deserialize(str);
}
return node;
}
}
利用非递归反序列化:
import java.util.Stack;
public class Solution {
String Serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
if (root == null)
{
sb.append("#,");
return sb.toString();
}
sb.append(root.val + ",");
sb.append(Serialize(root.left));
sb.append(Serialize(root.right));
return sb.toString();
}
TreeNode Deserialize(String str) {
if (str == null || str.length() == 0 || str.length() == 2)
return null;
String[] strings = str.split(",");
TreeNode[] treeNodes = new TreeNode[strings.length];
for (int i = 0; i < strings.length; i++)
{
if (!strings[i].equals("#"))
treeNodes[i] = new TreeNode(Integer.valueOf(strings[i]));
}
Stack<TreeNode> stack = new Stack<>();
stack.push(treeNodes[0]);
int i = 1;
while (treeNodes[i] != null)
{
stack.peek().left = treeNodes[i];
stack.push(treeNodes[i++]);
}
while (!stack.isEmpty())
{
stack.pop().right = treeNodes[++i];
if (treeNodes[i] != null)
{
stack.push(treeNodes[i++]);
while (treeNodes[i] != null)
{
stack.peek().left = treeNodes[i];
stack.push(treeNodes[i++]);
}
}
}
return treeNodes[0];
}
}
层序遍历
import java.util.LinkedList;
public class Solution {
String Serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
LinkedList<TreeNode> queue = new LinkedList<>();
if (root != null)
queue.add(root);
while (!queue.isEmpty())
{
TreeNode node = queue.poll();
if (node != null)
{
queue.add(node.left);
queue.add(node.right);
sb.append(node.val + ",");
}
else sb.append("#,");
}
return sb.toString();
}
TreeNode Deserialize(String str) {
TreeNode head = null;
if (str == null || str.length() == 0)
return head;
String[] strings = str.split(",");
TreeNode[] nodes = new TreeNode[strings.length];
for (int i = 0; i < strings.length; i++)
if (!strings[i].equals("#"))
nodes[i] = new TreeNode(Integer.valueOf(strings[i]));
for (int i = 0, j = 1; j < nodes.length; i++)
if (nodes[i] != null)
{
nodes[i].left = nodes[j++];
nodes[i].right = nodes[j++];
}
return nodes[0];
}
}