和我一起迎接明天的太阳吧

klaus08

焦虑源于行动的匮乏

JZ61 序列化二叉树

原题链接


描述

请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。



示例1

输入:{8,6,10,5,7,9,11}
返回值:{8,6,10,5,7,9,11}


思路

基于先序遍历,把所有结点的 val 保存到字符串中(用空格间隔开每个结点得到 val ),对于子结点为空的,用 "#" 标识也保存到字符串中,这就是序列化的过程。

然后是逆序列化,从头开始读字符串,因为已经用空格分开了,所以每个连在一起的字符都代表一个结点。首先第一个字符(数字或 # 后面不再重复,统一用字符代替)是根节点,下一个是根节点的左结点,下下个是根节点的右结点。如果字符是数字,说明该结点存在,返回一个以该值为 val 的结点;如果是 # ,说明该结点不存在返回null。

做的时候犯了错误,没有把逆序列化的参数提出来,所以即使函数里修改了但由于递归,后面还是原来的样子,导致结果出错。

解答

public class Solution {
    String str = "";
    String res = "";

    String Serialize(TreeNode root) {
        if (root == null) {
            return res += "# ";
        }
        res += root.val + " ";
        Serialize(root.left);
        Serialize(root.right);
        return res;
    }

    TreeNode Deserialize(String _str) {
        str = _str;
        return fun();
    }

    TreeNode fun() {
        if (str.length() == 0) return null;

        int index = str.indexOf(" ");
        System.out.println(index);
        String valueStr = str.substring(0, index);
        str = str.substring(index + 1);

        if (valueStr.equals("#")) return null;
        TreeNode root = new TreeNode(Integer.valueOf(valueStr));

        root.left = Deserialize(str);
        root.right = Deserialize(str);

        return root;
    }
}
posted @ 2021-08-05 14:25  klaus08  阅读(29)  评论(0)    收藏  举报