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

二叉树被记录成文件的过程叫做二叉树的序列号。通过文件内容重建原来二叉树的过程叫做二叉树的反序列号。

给定一个二叉树头节点head,并已知二叉树节点值的类型为32位整型。设计一种二叉树序列化,和反序列化方案,并且代码实现。

 

 

方法一,先序遍历下的序列化过程,首先假设徐立华的结果字符串为str,初始str=“”, 先序遍历二叉树,如果遇到null节点,就在str末尾加上“#”  节点不存在,“!”表示一个值的结束。如果遇到不为空的节点,假设节点值为3,就在str的末尾加上 3!。

package TT;

public class Test200 {

	public class Node{
		public int value;
		public Node left;
		public Node right;
		
		public Node(int data){
			this.value=data;
		}
	}
	
	
  public String serialByPre(Node head){
	  if(head==null){
		  return "#!";
	  }
	  String res = head.value+"!";
	  res += serialByPre(head.left);
	  res += serialByPre(head.right);
	  return res;
  }	
}

  接下来,通过先序遍历序列化的结果字符串str,重构二叉树的过程,反序列化。

方法二、通过层遍历实现序列化和反序列化

  初始时 str=“空”  然后实现二叉树的按层遍历,具体方式是利用队列结构,也就是宽度遍历图的常见方式。

 

package TT;

import java.util.LinkedList;
import java.util.Queue;

public class Test200 {

	public class Node{
		public int value;
		public Node left;
		public Node right;
		
		public Node(int data){
			this.value=data;
		}
	}
	
public String serialBylevel(Node head){
	if(head == null){
		return "#!";
	}
	String res = head.value+"!";
	Queue<Node> queue = new LinkedList<Node>();
	queue.offer(head);
	
	while(!queue.isEmpty()){
		head=queue.poll();
		if(head.left != null){
			res+=head.left.value+"!";
			queue.offer(head.left);
		}else {
			res+="#!";
		}
		if(head.right != null){
			res+=head.right.value+"!";
			queue.offer(head.right);
		}else {
			res+="#!";
		}
		
	}
	return res;
	
 }
 
}

  

先序遍历的反序列化其实就是重做先序遍历,遇到“#”就生成null节点,结束生成后续子树的过程

package TT;

import java.util.LinkedList;
import java.util.Queue;

public class Test200 {

	public class Node{
		public int value;
		public Node left;
		public Node right;
		
		public Node(int data){
			this.value=data;
		}
	}
	
public String serialBylevel(Node head){
	if(head == null){
		return "#!";
	}
	String res = head.value+"!";
	Queue<Node> queue = new LinkedList<Node>();
	queue.offer(head);
	
	while(!queue.isEmpty()){
		head=queue.poll();
		if(head.left != null){
			res+=head.left.value+"!";
			queue.offer(head.left);
		}else {
			res+="#!";
		}
		if(head.right != null){
			res+=head.right.value+"!";
			queue.offer(head.right);
		}else {
			res+="#!";
		}
		
	}
	return res;
	
 }
 


public Node reconByLevelString(String levelStr){
	
	 String[] values  = levelStr.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 Node generateNodeByString(String val){
	if(val.equals("#")){
		return null;
	}
	return new Node(Integer.valueOf(val));
}
















}

  

 

posted @ 2017-09-18 10:33  toov5  阅读(1552)  评论(0编辑  收藏  举报