美文网首页
LinkCode 7 二叉树的序列化和反序列化

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

作者: mecury | 来源:发表于2017-04-11 14:44 被阅读218次

    描述:

    设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。

    如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。

    给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构:

    3
    /
    9 20
    /
    15 7

    我们的数据是进行BFS遍历得到的。当你测试结果wrong answer时,你可以作为输入调试你的代码。

    你可以采用其他的方法进行序列化和反序列化。
    讲解:
    对于这个题我把树结构序列化为 3,9,20,15,7。空节点用#来表示。
    序列化过程:

    public String serialize(TreeNode root) {
            if (root == null) return "";
            //将所有的节点放入list中,包括null节点
            ArrayList<TreeNode> list = new ArrayList<>();
            list.add(root);
            for (int i = 0; i < list.size(); i++){
                TreeNode q = list.get(i);
                if (q == null){
                    continue;
                }
                list.add(q.left);
                list.add(q.right);
            }
    
            //去除尾部的null节点
            while (list.get(list.size()-1)==null){
                list.remove(list.size()-1);
            }
    
            //使用StringBuilder链接起来
            StringBuilder sb = new StringBuilder();
            sb.append(list.get(0).val);
            for (int i = 1; i < list.size(); i++){
                TreeNode node = list.get(i);
                if (node != null){
                    sb.append(",");
                    sb.append(node.val);
                } else {
                    sb.append(",#");
                }
            }
            return sb.toString();
        }
    

    反序列过程:

    if (data == ""){
                return null;
            }
            String[] vals = data.split(",");
            ArrayList<TreeNode> queue = new ArrayList<>();
            TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
            queue.add(root);
    
            int index = 0;  //标记父节点但的位置
            boolean isLeftChild = true; //判断是否为左子树,没链接一个节点就取反一次
            for (int i = 1; i < vals.length; i++){
                if (!vals[i].equals("#")){
                    TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
                    if (isLeftChild){
                        queue.get(index).left = node;
                    } else {
                        queue.get(index).right = node;
                    }
                    queue.add(node);
                }
                if (!isLeftChild){
                    index++;
                }
                isLeftChild = !isLeftChild;
            }
            return root;
        }
    

    相关文章

      网友评论

          本文标题:LinkCode 7 二叉树的序列化和反序列化

          本文链接:https://www.haomeiwen.com/subject/twayattx.html