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

程序员代码面试指南(左程云)读书笔记

 第三章

二叉树的序列化和反序列化 题目:

二叉树被记录成文件的过程叫做二叉树的序列化,通过文件内容重建原来的二叉树的过程叫做二叉树的反序列化。给定一棵二叉树的头节点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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值