本文中的二叉树序列化与反序列化均采用层次遍历非递归的方式完成。
空节点用‘#’隔开,节点与节点之间用空格隔开。
节点类:
class TreeNode {
int val = 0;
TreeNode1 left = null;
TreeNode1 right = null;
public TreeNode1(int val) {
this.val = val;
}
public String toString(){
return ""+val;
}
}
二叉树序列化与反序列化
import java.util.ArrayList;
public class SerializeTree {
String Serialize(TreeNode root) {
if(root==null){
return "";
}
ArrayList<TreeNode> list =new ArrayList<TreeNode>(); // 层次遍历后序节点存储队列,使用list 模拟queue 的功能
list.add(root);
TreeNode p=root;
TreeNode fg=new TreeNode(-1); // 标志节点,用于判断是否是null节点
String ans="";
while(!list.isEmpty()){
p=list.get(0);
list.remove(0);
if(p.equals(fg)){
ans+=" "+ "#";
}else{
if(ans==""){
ans+=p.val;
}else{
ans+=" "+p.val;
}
if(p.left!=null){
list.add(p.left);
}else{
list.add(fg);
}
if(p.right!=null){
list.add(p.right);
}else{
list.add(fg);
}
}
}
int i=0;
for(i=ans.length()-1;i>=0;i--){
if(ans.charAt(i)>='0'&&ans.charAt(i)<='9'){ //找到最后一个非“#”字符的位置
break;
}
}
return ans.substring(0, i+1);
}
TreeNode Deserialize(String str) {
if(str==null||str.length()==0){
return null;
}
String strs[]=str.split(" ");
// 存储每一个节点,包括null节点
ArrayList<TreeNode> list=new ArrayList<TreeNode>();
for(int i=0;i<strs.length;i++){
if(strs[i].equals("#")){
list.add(null);
}else{
list.add(new TreeNode(Integer.parseInt(strs[i])));
}
}
// list2 作为层次遍历存储数组
ArrayList<TreeNode> list2=new ArrayList<TreeNode>();
TreeNode head=list.get(0),p = null;
list.remove(0);
list2.add(head);
while(!list2.isEmpty()){
p=list2.get(0);
list2.remove(0);
if(p!=null){
if(list.size()!=0){
p.left=list.get(0);
list.remove(0);
list2.add(p.left);
}
if(list.size()!=0){
p.right=list.get(0);
list.remove(0);
list2.add(p.right);
}
}
}
return head;
}
public static void main(String args[]){
TreeNode root =new TreeNode(8);
TreeNode node1 =new TreeNode(6);
TreeNode node2 =new TreeNode(10);
TreeNode node3 =new TreeNode(5);
TreeNode node4 =new TreeNode(7);
TreeNode node5 =new TreeNode(9);
TreeNode node6 =new TreeNode(11);
root.left=node1;
root.right=node2;
node1.left=node3;
node1.right=node4;
node2.left=node5;
node2.right=node6;
//node2.right=node5;
//node5.left=node6;
SerializeTree test=new SerializeTree();
String ans = test.Serialize(root);
System.out.println("序列化:"+ans);
TreeNode head = test.Deserialize("8 6 10 5 7 9 11");
ans = test.Serialize(head);
System.out.println("序列化:"+ans);
}
}