序列化与反序列化二叉树

序列化二叉树

http://www.nowcoder.com/questionTerminal/cf7e25aa97c04cc1a68c8f040e71fb84

序列化与反序列化二叉树

题目要求很明确:

使用!来分割值value,使用#来代替null值

根据题意:(采用的是前序遍历,中左右)

1
2 3
4 5 6 7
序列化之后的结果为:1!2!4!#!#!5!#!#!3!6!#!#!7!#!#!

序列化很简单,只需要在遇到null的时候添加#!号,遇到数值添加!即可

    String Serialize(TreeNode root) {
        if (root == null) return "";
        return helpSerialize(root, new StringBuilder()).toString();
    }

    private StringBuilder helpSerialize(TreeNode root, StringBuilder s) {
        if (root == null) return s;
        s.append(root.val).append("!");
        if (root.left != null) {
            helpSerialize(root.left, s);
        } else {
            s.append("#!"); // 为null的话直接添加即可
        }
        if (root.right != null) {
            helpSerialize(root.right, s);
        } else {
            s.append("#!");
        }
        return s;
    }

反序列化的时候,由于采用的是先序遍历,此时如果遇到了#号,我们知道左边结束了,要开启右边,如果再次遇到#,表示当前整个部分的左边结束了要开始右子树。。依次类推。

    private int index = 0; // 设置全局主要是遇到了#号的时候需要直接前进并返回null

    TreeNode Deserialize(String str) {
        if (str == null || str.length() == 0) return null;
        String[] split = str.split("!");
        return helpDeserialize(split);
    }

    private TreeNode helpDeserialize(String[] strings) {
        if (strings[index].equals("#")) {
            index++;// 数据前进
            return null;
        }
        // 当前值作为节点已经被用
        TreeNode root = new TreeNode(Integer.valueOf(strings[index]));
        index++; // index++到达下一个需要反序列化的值
        root.left = helpDeserialize(strings);
        root.right = helpDeserialize(strings);
        return root;
    }

Keep thinking keep coding~

全部评论
楼主我有个疑问,在helpSerialize函数中,如果遇到root.left和root.right都为null的时候,好像函数就结束了,那遍历到节点4之后怎么继续的呢
点赞 回复 分享
发布于 2020-03-15 10:46
我理解了,递归函数中return是回退上一层,我习惯性看成函数结束了,谢谢楼主,代码写的很好
点赞 回复 分享
发布于 2020-03-15 10:57
如果第一个节点就是空 不用拿“#!”表示吗?
点赞 回复 分享
发布于 2020-04-27 11:47

相关推荐

落叶随风呀:学校不好就放两栏,专业能力往前移, 政治面貌不是党员不如不写,籍贯湖南衡阳,或者湖南,浅尝辄止 基本信息排版不够美观,没有对齐 简历上花里胡哨的东西去掉 项目我不评价,因为我能力有限,且对mcu了解不足 但是这份简历掌握的水平,你可以海投试试,工作没问题但是工资应该不会高,因为搞mcu的小公司多
点赞 评论 收藏
分享
北斗导航Compass低仿版:没必要写这么多东西,还是尽量浓缩成一页,自我评价,git和cursor Trae这些都可以去掉。实习经历的描述最好根据star法则改一下,别这么直白
点赞 评论 收藏
分享
评论
30
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务