【0007】二叉树的序列化和反序列化问题

问题描述:
如何编写一个算法以实现二叉树序列化反序列化

  1. 将树写入一个文件被称为“序列化”。
  2. 读取文件后重建同样的二叉树被称为“反序列化”。

重点
在执行序列化及反序列化时,Node节点为空需要转化输出为#

输入:{3,9,20,#,#,15,7}
输出:{3,9,20,#,#,15,7}
解释:
二叉树 {3,9,20,#,#,15,7},表示如下的树结构:
	  3
	 / \
	9  20
	  /  \
	 15   7
它将被序列化为 {3,9,20,#,#,15,7}

主要考点
二叉树序列化为及反序列化的逻辑算法

算法逻辑

  1. 序列化
    1. 判断获取的TreeNode节点是否存在(非空)
    2. 获取并判断TreeNode的子节点是否存在
    3. 若存在则将正确的节点数据组装重复步骤2下钻获取子节点直至子节点为空
    4. 若不存在则将#看作占位符置入序列化字符串中返回空并中止当前的子节点下钻
  2. 反序列化
    1. 声明反序列化变量now = 0(可理解为目前二叉树的层级,默认从根节点开始向下延展)
    2. 将序列化的字符串转化为Array数组
    3. 循环判断Array数组中的值是否存在(#为空节点)
    4. 值为#,则返回空并中止当前子节点继续下钻。
    5. 值不为#,则实例化TreeNode并构建对应的二叉树结构。
    6. 重复步骤3,4,5构建TreeNode子节点,直至没有下级子节点。

代码实现:

    public String serialize(TreeNode root) {
        return doSerialize(root);
    }
    
    private String doSerialize(TreeNode root){
        if(root == null)
            return "#";
        String left = doSerialize(root.left);
        String right = doSerialize(root.right);
        return String.valueOf(root.val) + "," + left + "," + right;
    }

    int now;
    
    public TreeNode deserialize(String data) {
        now = 0;
        return doDeserialize(data.split(","));
    }
    
    private TreeNode doDeserialize(String[] array){
        if(array[now].equals("#")){
            now++;
            return null;
        }
        TreeNode root = new TreeNode(Integer.valueOf(array[now]));
        now++;
        root.left = doDeserialize(array);
        root.right = doDeserialize(array);
        return root;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值