题目:请实现两个函数,分别用来序列化和反序列化二叉树。
思路:
1.使用前序遍历来序列化二叉树,当碰到子节点为null的时候,用特殊字符’$’来表示。
基于上述思路,参考java代码如下:
public class _37_SerializeBinaryTrees
{
public static class TreeNode
{
public int val = 0;
public TreeNode left = null;
public TreeNode right = null;
public TreeNode(int val)
{
this.val = val;
}
}
/**
* 序列化
*/
public String Serialize(TreeNode root)
{
if(root == null)
return "$";
StringBuilder sb = new StringBuilder();
Serialize(root, sb);
return sb.toString();
}
private void Serialize(TreeNode root, StringBuilder sb)
{
if(root == null)
{
sb.append("$");
return;
}
sb.append(root.val);
Serialize(root.left, sb.append(","));
Serialize(root.right, sb.append(","));
}
private int index;
/**
* 反序列化
*/
public TreeNode Deserialize(String str)
{
if(str == null || str.trim().length() == 0)
return null;
String[] nums = str.split(",");
index = 0;
return Deserialize(nums);
}
public TreeNode Deserialize(String[] nums)
{
if(nums[index].equals("$"))
{
++index;
return null;
}
TreeNode node = new TreeNode(Integer.valueOf(nums[index++]));
node.left = Deserialize(nums);
node.right = Deserialize(nums);
return node;
}
}
测试用例:
a.功能测试(输入的二叉树是完全二叉树;所有节点都没有左或右子树的二叉树;只有一个节点的二叉树;所有节点的值都相同的二叉树)。
b.特殊输入测试(指向二叉树根节点的指针为nullptr指针)。