二叉树系列之「序列化二叉树」

请实现两个函数,分别用来序列化和反序列化二叉树

二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树。

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息

这里提供先序遍历的实现。

Java实现如下

/**
 * @Author Hory
 * @Date 2020/9/22
 */
public class Solution {
    private static int index;

    public static void main(String[] args) {
        TreeNode n1 = new TreeNode(1);
        TreeNode n2 = new TreeNode(2);
        TreeNode n3 = new TreeNode(3);
        TreeNode n4 = new TreeNode(4);
        TreeNode n5 = new TreeNode(5);
        TreeNode n6 = new TreeNode(6);
        n1.left = n2;
        n1.right = n3;
        n2.left = n4;
        n3.left = n5;
        n3.right = n6;
        System.out.println(Serialize2(n1));
    }

    public static class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;

        public TreeNode(int val) {
            this.val = val;
        }
    }

    /**
     * 序列化第一种实现
     * @param root
     * @return
     */
    private static String Serialize(TreeNode root) {
        if(root == null) return "";
        return helpSerialize(root, new StringBuilder()).toString();
    }
    private static StringBuilder helpSerialize(TreeNode root, StringBuilder res){
        if(root == null) return res;
        res.append(root.val).append(",");
        if(root.left != null) {
            helpSerialize(root.left,res);
        }else{
            res.append("#,");
        }
        if(root.right != null){
            helpSerialize(root.right,res);
        }else{
            res.append("#,");
        }
        return res;
    }

    /**
     * 序列化第二种实现
     * @param root
     * @return
     */
    private static String Serialize1(TreeNode root){
        if(root == null) return "#,";
        String res = "" + root.val + ",";
        return  res += Serialize1(root.left) + Serialize1(root.right);
    }

    /**
     * 序列化第三种实现
     * @param root
     * @return
     */
    private static String Serialize2(TreeNode root){
        if (root == null) return "#";
        return root.val + "," + Serialize(root.left) + "," + Serialize(root.right);
    }

    /**
     * 反序列化
     * @param str
     * @return
     */
    private static TreeNode Deserialize(String str){
        String[] s = str.split(",");   //以分隔符","转化为数组
        index++;
        int len = s.length;
        if(index > len) return null;
        TreeNode treeNode = null;
        if(!s[index].equals("#")){
            treeNode = new TreeNode(Integer.parseInt(s[index]));
            treeNode.left = Deserialize(str);
            treeNode.right = Deserialize(str);
        }
        return treeNode;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值