树 - 37序列化二叉树

在这里插入图片描述

思路:序列化,我们可以从题目上看出序列化是按照层数去序列化,并且是从左到右的打印。所以很明显。这种序列化就是按层打印二叉树。使用队列,将当前节点放入队列,再遍历左右孩子再入队,最后toString返回即可。

反序列化:反序列化我们同样采用一个队列,我们遍历字符串。index 表示遍历的字符下标初始值为0。
第一步 :index下标的值new一个节点,也就是root,并且入队。
第二步,给当前对头的节点左孩子new 一个节点,值为index下标,然后index++ ,给右孩子new 一个 新的节点,index++。此时,当前对头出队,左右孩子只要不为空就入队。
第三步:只要队列中还有节点,就一直重复第二步。
最后返回root节点即可。

 // Encodes a tree to a single string.
    public static String serialize(TreeNode root) {
        if(root == null) return "";
        ArrayList<Integer> result = new ArrayList<>();
        LinkedList<TreeNode> queue = new LinkedList<>();
        //首先将根节点入队
        queue.add(root);
        //每处理完一个节点就出队一个节点。
        while(!queue.isEmpty()){
            //当前对头节点的值添加到结果集中
            TreeNode current = queue.peekFirst();
            if(current != null) {
                result.add(current.val);
                //把左右孩子入队。
                    queue.add(current.left);
                    queue.add(current.right);
            }else {
                result.add(null);
            }
            //当前对头出队
            queue.pollFirst();
        }
        return result.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        String res = data.substring(1,data.length()-1);
        String[] values = res.split(",");
        int index = 0;
        TreeNode root = grenateNode(values[index++]);
        //按照队列的形式new节点
        LinkedList<TreeNode> queue = new LinkedList<>();
        //让根节点入队
        queue.add(root);
        while(!queue.isEmpty()){
            //对头出队
            TreeNode treeNode = queue.pollFirst();
            //生成孩子节点
            treeNode.left = grenateNode(values[index++]);
            treeNode.right = grenateNode(values[index++]);
            //孩子节点入队
            if(treeNode.left!=null)
                queue.add(treeNode.left);
            if(treeNode.right!=null)
                queue.add(treeNode.right);
        }
        return root;
    }

    private TreeNode grenateNode(String number){
        if(number.equals("null")) return null;
        return new TreeNode(Integer.parseInt(number));
    }
原创文章 139 获赞 23 访问量 5929

猜你喜欢

转载自blog.csdn.net/weixin_44916741/article/details/104367984