import java.util.*;
//二叉树的序列化和反序列化
public class SerializeTree{
//二叉树结点的定义
public static class Node{
public int value;
public Node left;
public Node right;
public Node(int data)
{
this.value=data;
}
}
///***递归的方式实现******************
//(1)序列化二叉树 (将二叉树记录成文件(字符串))
public static String serializeTree(Node head)
{
if(head==null)
{
//# 表示null !表示结束
return "#!";
}
String str=head.value+"!";
str+=serializeTree(head.left);
str+=serializeTree(head.right);
return str;
}
//(2)二叉树的反序列化(将文件内容重建为二叉树)
public static Node RserializeTree(String str)
{
String[]values=str.split("!"); //字符串按照!切割
Queue<String>queue=new LinkedList<String>(); //存储值的队列
for(int i=0;i!=values.length;i++)
{
queue.offer(values[i]);
}
return ReserializeTree(queue);
}
//将队列中的元素反序列化
public static Node ReserializeTree(Queue<String>queue)
{
String value=queue.poll();
if(value.equals("#"))
{
return null;
}
Node head=new Node(Integer.valueOf(value)); //字符串转整数
head.left=ReserializeTree(queue); //递归调用重建二叉树
head.right=ReserializeTree(queue);
return head;
}
//*************************************
//***非递归(层序遍历)的方式实现******************
//(1)序列化二叉树 (将二叉树记录成文件(字符串))
public static String serializeTree2(Node head)
{
if(head==null)
{
return "#!";
}
String str=head.value+"!";
Queue<Node>queue=new LinkedList<Node>();
queue.offer(head);
//层序遍历
while(!queue.isEmpty())
{
head=queue.poll();
if(head.left!=null)
{
str+=head.left.value+"!";
queue.offer(head.left);
}else{
str+="#!";
}
if(head.right!=null)
{
str+=head.right.value+"!";
queue.offer(head.right);
}else{
str+="#!";
}
}
return str;
}
//(2)二叉树的反序列化(将文件内容重建为二叉树)
public static Node RserializeTree2(String str)
{
String[]values=str.split("!");
int index=0;
Node head=generateNodeByString(values[index++]);
Queue<Node>queue=new LinkedList<Node>();
if(head!=null)
{
queue.offer(head);
}
Node node=null;
while(!queue.isEmpty())
{
node=queue.poll(); //弹出头节点
node.left=generateNodeByString(values[index++]);
node.right=generateNodeByString(values[index++]);
if(node.left!=null)
{
queue.offer(node.left);
}
if(node.right!=null)
{
queue.offer(node.right);
}
}
return head;
}
public static Node generateNodeByString(String str)
{
if(str.equals("#"))
{
return null;
}
return new Node(Integer.valueOf(str));
}
//*****************************************************
//先序遍历二叉树
public static void RecurPreOrder(Node head)
{
if(head==null)
{
return ;
}
System.out.print(head.value+" ");
RecurPreOrder(head.left);
RecurPreOrder(head.right);
System.out.println();
}
public static void main(String[]args)
{
//System.out.println("Hello");
Node node=new Node(12);
node.left=new Node(3);
//RecurPreOrder(node);
//序列化二叉树
System.out.println(serializeTree(node));
//反序列化二叉树
String str="12!3!#!#!#!";
Node mode=RserializeTree(str);
RecurPreOrder(mode); //先序遍历序列化的二叉树
//序列化二叉树
System.out.println(serializeTree2(node));
//反序列化二叉树
String str2="12!3!#!#!#!";
Node mode2=RserializeTree2(str2);
RecurPreOrder(mode2); //先序遍历序列化的二叉树
}
}
二叉树的序列化和反序列化
最新推荐文章于 2024-07-18 18:08:02 发布