二叉树的序列化和反序列化

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); //先序遍历序列化的二叉树
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值