您的位置:首页 > 理论基础 > 数据结构算法

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

2016-08-24 20:53 429 查看
程序员代码面试指南(左程云)读书笔记 第三章二叉树的序列化和反序列化
题目: 二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建原来的二叉树的过程叫做二叉树的反序列化。给定一棵二叉树的头节点head,并已知二叉树节点值得类型为32为整形。请设计一种二叉树序列化和反序列化的方案,并用代码实现。方法一 通过先序遍历实现序列化和发序列化 首先假设序列化的结果字符串为str,初始时str="",先序遍历二叉树,如果遇到null节点,就在str的末尾加上“#!”,“#”表示这个节点为空,节点值不存在,“!”表示一个值的结束.


public class SerialBypre { public static void main(String[] args) {    TreeNode no1=new TreeNode(2);    TreeNode no2=new TreeNode(3);    TreeNode no3=new TreeNode(4);    no1.left=no2;    no1.right=no3;    System.out.println(serialBypre(no1));} public static String serialBypre(TreeNode head){     if(head==null){         return "#!";     }     String res=head.val+"!";     res+=serialBypre(head.left);     res+=serialBypre(head.right);     return res; }}public class TreeNode  {           public  int val;             public TreeNode  left;            public TreeNode  right;            public TreeNode (int val) {this. val = val; }
}

接下来是反序列化 把结果字符串str变成字符串类型的数组,记为values,数组代表一棵二叉树先序遍历的节点顺序。例如:str="12!3!#!#!#!",生成的values为【‘12’,‘3’,‘#’,‘#’,‘#’】,然后用values[0..4]按照先序遍历的顺序建立整棵树。 1,遇到“12”,生成节点值12的节点(head) 然后用values[1..4]简历节点12的左子树。 2,遇到‘3’,生成节点值为3的节点,它是节点12的左孩子,然后用values[2..4]建立节点3的左子树。 3,遇到‘#’,生成null节点,它是节点3的左孩子,该节点为null,所以这个节点没有后续建立子树过程。回到节点3后,用values[3..4]建立节点3的右子树。 4,遇到“#”生成null节点,它是节点3的右孩子,该节点为null,所以这个节点没有后续建立子树过程。回到节点3后,再回到节点1,用values[4]建立节点1的右子树。 5,遇到“#”,生成null节点,它是节点1的右孩子,该节点为null,所以这个节点没有后续建立子树过程。整个过程结束。代码:
 public TreeNode reconByPreString(String preStr){     String values[] =preStr.split("!");     Queue<String> queue=new LinkedList<String>();     for(int i=0;i!=values.length;i++){         queue.offer(values[i]);     }     return reconPreOrder(queue); } private TreeNode reconPreOrder(Queue<String> queue) {      String value=queue.poll();      if(value.equals("#")){          return null;      }      TreeNode head=new TreeNode(Integer.valueOf(value));      head.left=reconPreOrder(queue);      head.right=reconPreOrder(queue);
    return head;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息