JZ37序列化二叉树

题目地址:序列化二叉树_牛客题霸_牛客网

题目回顾:

JZ37序列化二叉树_第1张图片

JZ37序列化二叉树_第2张图片

解题思路:

首先,序列化就是将二叉树的节点值放入一个字符串中,这里可以按照前序遍历的思路来进行操作,谦虚遍历是:根左右的情况,其中根据题意我们用"#"来表示空节点,用!来表示节点与节点之间的分割。

而反序列化就是根据序列化得到的字符串将二叉树进行重建操作,这里类似于加密解密的过程。由于我们在序列化的时候采用的是前序遍历,因此在反序列化的过程中,我们也要采用前序遍历。

首先处理空树的情况,在空树时,我们返回”#“,然后调用递归函数前序递归遍历二叉树。

在前序递归函数中,如果遇到非空节点会将其添加到str中,当然也包括表示节点与节点间分割的!符。然后依次递归它的左子树和右子树。

index则表示的是序列中的下标。

进行反序列化的时候,首先处理空树的情况,也就是说如果字符串是”#“表示这是一个空树。如果不是,就调用反序列化的递归函数前序递归重建二叉树。在这个递归函数当中,如果遇到”#“表示当前节点是空节点,如果遇到数字则根据!符来进行分割操作,同时将数字加入到节点中。根据前序遍历根左右的顺序依次递归左右子树。

整体代码:

 public int index = 0; 

    private void SerializeFunction(TreeNode root, StringBuilder str){
        if(root == null){
            str.append('#');
            return;
        }
        str.append(root.val).append('!');
        SerializeFunction(root.left, str); 
        SerializeFunction(root.right, str);
    }
    //序列化
    public String Serialize(TreeNode root) {
        if(root == null) 
            return "#";
        StringBuilder res = new StringBuilder();
        SerializeFunction(root, res);
        return res.toString();
    }


    private TreeNode DeserializeFunction(String str){
        if(str.charAt(index) == '#'){ 
            index++;
            return null;
        }
        int val = 0;
        while(str.charAt(index) != '!' && index != str.length()){ 
            val = val * 10 + ((str.charAt(index)) - '0');
            index++;
        }
        TreeNode root = new TreeNode(val);
        if(index == str.length()) 
            return root;
        else
            index++;
        root.left = DeserializeFunction(str);  
        root.right = DeserializeFunction(str);
        return root;
    }
    //反序列化
    public TreeNode Deserialize(String str) {
        if(str == "#") 
            return null;
        TreeNode res = DeserializeFunction(str);
        return res;
    }

你可能感兴趣的:(力扣刷题,算法,java,数据结构)