剑指Offer61:序列化二叉树(Java)

参考“春天花卉副校长”的牛客解答:https://www.nowcoder.com/questionTerminal/cf7e25aa97c04cc1a68c8f040e71fb84?f=discussion

思路分析:

序列化:序列化好办,遍历一遍连成一个字符串。

反序列化:不好弄,难在实现父节点与孩子节点的关系。(详见代码中的注释)

题目描述

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

Java代码:

public class Solution {
    int index=0;
    String Serialize(TreeNode root) {
        if(root==null){
            String string="#!";
            return string;
        }
        String str=String.valueOf(root.val)+"!";//这个结点被遍历了  先序遍历
        Serialize(root.left);
        Serialize(root.right);
        return str+Serialize(root.left)+Serialize(root.right);
  }
    /*
    最大的困难时实现父节点与左右孩子之间的关系
    把字符串用结点结束标志切割成字符串数组string,这个字符串每个元素就是二叉树结点的数值,只不过是字符串格式的
    把字符串用结点结束标志切割成字符串数组string,这个字符串每个元素就是二叉树结点的数值,只不过是字符串格式的
    建一个全局变量index当作数组坐标,指向当前数组所指向的字符串(即要插入的结点的数值)。
    index从等于0开始,string[index]若不是“#”,则创建一个二叉树结点node,node的左孩子是刚才过程的递归的结果;
    node的右孩子是node左孩子被赋值后,递归刚才过程得到的。
    每次递归index都会自增一,按顺序拿到ch数组的元素。
    string[index]若是“#”,返回是null的结点。
    */
    TreeNode Deserialize(String str) {
        String []string=str.split("!");
        TreeNode node=null;
        if(!string[index].equals("#")){//String之间的相等与否不能用"=="或"!=",要使用.equal()方法
            node=new TreeNode(Integer.valueOf(string[index++]));
            node.left=Deserialize(str);
            node.right=Deserialize(str);
        }
        else{
            index++;
        }
        
        return node;
  }
}
posted @ 2020-02-20 17:25  31楼下小黑  阅读(251)  评论(0编辑  收藏  举报