序列化二叉树
题目
请实现两个函数,分别用来序列化和反序列化二叉树。
思路
一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,但是其实可以只采用前序遍历(从根结点开始),将空结点(null)输出为一个特殊符号(如“$”),就可以确定一个二叉树了。
将二叉树序列化为字符串,就是前序遍历的过程,遇见空结点时,序列化为“$”,每个结点间使用逗号分隔开。
将字符串反序列化为二叉树,也使用前序遍历,遇见一个新数字(或者$)就建立一个新结点,不过需要注意的是,数字可能不只是个位数字,因此创建了一个全局Int变量index(在字符串上的移动的指针),以便于截取字符串中当前的结点值。(详见代码)
测试用例
1.功能测试(一个结点;左右斜树;完全二叉树;普通二叉树)
2.特殊测试(根结点为null)
序列化代码
public class serialize {
public static class TreeNode{
int val;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int val) {
this.val = val;
}
}
public static void construct(TreeNode root, TreeNode left,TreeNode right){
root.left=left;
root.right=right;
}
public static void serializeTree(TreeNode root){
if(root==null)
return;
ArrayList queue=new ArrayList();
outSerializeTree(queue,root);
System.out.println(queue);
String list=null;
//把ArrayList转化成
for(int i=0;i<queue.size()-1;i++){
System.out.print(queue.toArray()[i]+" ");
list=queue.toArray()[i]+" ";
}
System.out.println(list);
}
public static void outSerializeTree(ArrayList queue,TreeNode root){
queue.add(root.val);
if(root.left==null&&root.right==null)
{
queue.add("$");
queue.add("$");
return;
}
if(root.left!=null&&root.right!=null){
outSerializeTree(queue,root.left);
outSerializeTree(queue,root.right);
return;
}
if (root.left!=null&&root.right==null){
outSerializeTree(queue,root.left);
queue.add("$");
return;
}
if(root.right!=null&&root.left==null){
queue.add("$");
outSerializeTree(queue,root.right);
return;
}
}
public static void main(String[] args) {
TreeNode node11=new TreeNode(1);
TreeNode node21=new TreeNode(2);
TreeNode node22=new TreeNode(3);
TreeNode node31=new TreeNode(4);
TreeNode node33=new TreeNode(5);
TreeNode node34=new TreeNode(6);
construct(node11,node21,node22);
node21.left=node31;
construct(node22,node33,node34);
serializeTree(node11);
}
}
反序列化二叉树
题目
请实现两个函数,分别用来序列化和反序列化二叉树。
思路
一般情况下,需要采用前/后序遍历和中序遍历才能确定一个二叉树,但是其实可以只采用前序遍历(从根结点开始),将空结点(null)输出为一个特殊符号(如“$”),就可以确定一个二叉树了。
将字符串反序列化为二叉树,也使用前序遍历,遇见一个新数字(或者$)就建立一个新结点,不过需要注意的是,数字可能不只是个位数字,因此创建了一个全局Int变量index(在字符串上的移动的指针),以便于截取字符串中当前的结点值。(详见代码)