0
点赞
收藏
分享

微信扫一扫

序列化二叉树(困难)

一ke大白菜 2022-03-12 阅读 55
javaleetcode

题目描述

示例

做题思路

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {
    public String serialize(TreeNode root) {
        if(root == null) return "[]";
        StringBuilder res = new StringBuilder("[");//初始化为中括号
        Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }};//队列初始化时添加根节点
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();//将队中元素出队
            if(node != null) {//若节点不为空,字符串中加入节点的val,当前节点的左子节点和右子节点入队
                res.append(node.val + ",");
                queue.add(node.left);
                queue.add(node.right);
            }
            else res.append("null,");//若节点为空,则字符串中加入null,且空节点没有左右子节点
        }
        res.deleteCharAt(res.length() - 1);//删掉最后一个“,”
        res.append("]");//最后在字符串中加上中括号
        return res.toString();
    }

    public TreeNode deserialize(String data) {
        if(data.equals("[]")) return null;
        String[] vals = data.substring(1, data.length() - 1).split(",");//将字符串转化为字符串数组(去头尾中括号并且以“,”分割)
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));//创建根节点
        Queue<TreeNode> queue = new LinkedList<>() {{ add(root); }};//根节点入队
        int i = 1;//遍历序列化数据的索引(初始化为指向根节点的左子节点)
        while(!queue.isEmpty()) {
            TreeNode node = queue.poll();//队头节点出队
            if(!vals[i].equals("null")) {
                node.left = new TreeNode(Integer.parseInt(vals[i]));//构建新的左子节点并完成指向
                queue.add(node.left);//左子节点入队
            }
            i++;//索引右移
            if(!vals[i].equals("null")) {
                node.right = new TreeNode(Integer.parseInt(vals[i]));//构建新的右子节点并完成指向
                queue.add(node.right);//右子节点入队
            }
            i++;//索引右移
        }
        return root;//返回根节点
    }
}


// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
举报

相关推荐

0 条评论