美文网首页
38、序列化二叉树

38、序列化二叉树

作者: GIndoc | 来源:发表于2019-10-29 16:47 被阅读0次

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

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

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

链接:https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84

先序遍历思路:
先序遍历是先遍历根节点。再遍历左子树,再遍历右子树;左子树、右子树的遍历一样,典型的递归思路。

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

    public TreeNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    
    String Serialize(TreeNode root) {
        // 如果传进来的是个空节点,则返回#!(以 ! 表示一个结点值的结束)
        if(root==null) return "#!";
        StringBuilder sb = new StringBuilder();
        // 先添加根节点的值
        sb.append(root.val).append("!");
        // 然后再添加 左子树序列化后的字符串
        sb.append(Serialize(root.left));
        // 最后添加 右子树序列化后的字符串
        sb.append(Serialize(root.right));
        return sb.toString();
    }
    
    int start = 0;                  // 用于标识当前反序列化的字符下标
    
    TreeNode Deserialize(String str) {
        if(str==null || str.length()==0) return null;
        return deserialize(str.split("!"));
    }

    TreeNode deserialize(String[] str){
        // 如果下标超出数组大小,说明反序列化完成
        if(start >= str.length) return null;
        // 如果当前反序列化的字符是#,说明是空节点
        if(str[start].equals("#")) return null;
        // 将字符转成节点
        int val = Integer.valueOf(str[start]);
        TreeNode node = new TreeNode(val);
        // 反序列化左子树
        ++start;
        node.left = deserialize(str);
        // 反序列化右子树(这一步可以看出start声明成全局的作用是为了确定右子树根节点的下标,不是简单的start+2)
        ++start;
        node.right = deserialize(str);
        return node;
    }
}

后序遍历和先序遍历差不多,只是反序列化的时候从字符串尾端开始:

    String Serialize(TreeNode root){
        if(root==null) return "#!";
        StringBuilder sb = new StringBuilder();
        sb.append(Serialize(root.left));
        sb.append(Serialize(root.right));
        sb.append(root.val).append("!");
        return sb.toString();
    }
    
    int start = 0;
    
    TreeNode Deserialize(String str) {
        if(str==null || str.length()==0) return null;
        start = str.split("!").length-1;
        return deserialize(str.split("!"));
    }
    
    TreeNode deserialize(String[] str){
        if(start < 0 || str[start].equals("#")){
            return null;
        }else{
            int val = Integer.valueOf(str[start]);
            TreeNode node = new TreeNode(val);
            --start;
            node.right = deserialize(str);
            --start;
            node.left = deserialize(str);
            return node;
        }
    }

层序:

  String Serialize(TreeNode root){
        if(root==null) return "#!";
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        StringBuilder sb = new StringBuilder();
        while(!queue.isEmpty()){
            TreeNode node = queue.poll();
            if(node!=null){
                sb.append(node.val).append("!");
                queue.offer(node.left);
                queue.offer(node.right);
            }else{
                sb.append("#!");
            }
        }
        return sb.toString();
    }
    
    TreeNode Deserialize(String str) {
        if(str==null || str.length()==0) return null;
        String[] strs = str.split("!");
        TreeNode[] nodes = new TreeNode[strs.length];
        for(int i=0; i<strs.length; ++i){
            if(!strs[i].equals("#")){
                nodes[i]= new TreeNode(Integer.valueOf(strs[i]));
            }
        }
        for(int i=0,j=1; i<strs.length; ++i){
            if(nodes[i]!=null){
                nodes[i].left = nodes[j++];
                nodes[i].right = nodes[j++];
            }
        }
        return nodes[0];
    }

相关文章

  • 剑指offer刷题记录(C++版本)(之七)

    61.序列化二叉树??? 题目:请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按...

  • JZ-061-序列化二叉树

    序列化二叉树 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。二叉树的序列化是指:把一棵二叉树按照某种遍...

  • 二叉树的三种遍历方法

    二叉树的序列化 为了方便构造二叉树来验证我们的算法,这里先介绍下二叉树的序列化和反序列化。 序列化 先序遍历整颗二...

  • LeetCode:序列化二叉树

    面试题37. 序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。示例:你可以将以下二叉树: 序列化为 ...

  • 二叉树序列化和反序列化

    二叉树序列化和反序列化 前序 序列化和反序列化

  • 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 思路 二叉树的序列化就是采用前序遍历二叉树输出节点,再碰...

  • 面试题37:序列化二叉树

    题目 实现两个函数,分别用来序列化和反序列化二叉树 解题思路 序列化根据前序遍历的顺序序列化二叉树,从根节点开始,...

  • 剑指Offer-61 二叉树序列化

    请实现两个函数,分别用来序列化和反序列化二叉树 利用广度遍历实现二叉树的序列化和非序列化。核心思想:广度遍历

  • 剑指Offer Java版 面试题37:序列化二叉树

    题目:请实现两个函数,分别用来序列化和反序列化二叉树。可以根据前序遍历的顺序来序列化二叉树。在遍历二叉树碰到nul...

  • 37:序列化二叉树

    题目37:序列化二叉树 请实现两个函数,分别用来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件...

网友评论

      本文标题:38、序列化二叉树

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