先序遍历递归实现序列化与反序列化

序列化二叉树

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


1.采用层次遍历虽然易于人观察,但代码实现起来麻烦,本次借鉴leetcode官方题解,采用先序遍历实现序列化与反序列化。
2.先序遍历的按 root -> left subtree -> right subtree(根左右)的顺序递归进行,例如下面这幅图
序列化结果
注意:按牛客网的格式,结果应为 "1!2!3!#!#!4!#!#!5!#!#!" 即用#表示空节点,且每个节点后跟!表示结束。

    /**
     * 先序遍历序列化二叉树
     * @param root
     * @return
     */
    public String Serialize(TreeNode root) {
        return rSerialize(root, "");
    }

    private String rSerialize(TreeNode root, String s) {
        if (root == null)
            s+= "#!";
        else {
            s += root.val+"!";
            s = rSerialize(root.left, s);
            s = rSerialize(root.right,s);
        }
        return s;
    }

3.现在让我们反序列化"1!2!3!#!#!4!#!#!5!#!#!" ,同样采用先序遍历的思想,为了方便观察和后续操作,我们先将其分割成数组并存入链表。[1 , 2, 3, #, #, 4, #, #, 5, #, #]
先序遍历的数组总是可以分为三部分[ [根] , [左子树的先序序列] , [右子树的先序序列] ],且每部分的首位元素为该部分子树的根节点。
[ 1 ][2, 3, #, #, 4, #, #] [5, #, #] 的父节点。
[ 2 ]又是[ 3, #, #] [4, #, #]的父节点
以此类推...
按照这种思想,我们写出反序列化的代码:

    /**
     * 反序列化先序,通过字符串构建树
     * @param str
     * @return
     */
    public TreeNode Deserialize(String str) {
        String[] nodes = str.split("!");    //将字符串划分成数组
        List<String> node_list = new LinkedList<>(Arrays.asList(nodes));
        return rDeserialize(node_list);
    }


    private TreeNode rDeserialize(List<String> node_list) {
        //当前节点为空,则返回null
        if (node_list.get(0).equals("#") || node_list.get(0) == "#"){
            node_list.remove(0);
            return null;
        }
        //总是根据首位元素确定当前子树的根
        TreeNode root = new TreeNode(Integer.valueOf(node_list.get(0)));
        node_list.remove(0);    
        root.left = rDeserialize(node_list);    
        root.right = rDeserialize(node_list);
        //返回当前jiedian
        return root;
    }
全部评论
只有前序的时候,无法复原整个树吧,任意两序组合起来才可以吧,比如865##7##109##11##,如何判断左子树到哪里为止呢?
点赞 回复 分享
发布于 2024-03-04 18:46 北京
写的挺好的,代码很简洁,但是在反序列化时的判空代码:node_list.get(0) == "#"可以去掉,直接用node_list.get(0).equals("#")判断就行
点赞 回复 分享
发布于 2022-07-27 17:25
写的不错,为啥点赞的少呢
点赞 回复 分享
发布于 2021-01-29 08:12

相关推荐

05-12 18:24
长安大学 UE4
因为是家里第一代大学生,报专业报学校都没人可以指导,只能自己看着来毕业找工作,父母只知道考公务员啊考教师啊,丝毫不考虑难度我说要去大城市打工才行,小县城对学历没有需求,开的工资都很低,两三千养活不了的结果都不同意我去大城市,觉得北上广深远,不稳定,一年到头不着家,养这么大孩子算白养了要我怎么办,不考公不考编就是死路一条呗,出去打工就是不孝呗可是考公考编也好难,考上也是小职员,到时候又变成了家里第一代体制内了,不还是样样靠自己有时候很羡慕同学,要去大城市打拼,家里都很支持去看看外面的世界也羡慕同学父母都是体制内的,考上还有所依靠家里没有办法给予帮助,简直是进入死胡同一样
Two_Shadow:你先拿到offer,路是自己走的,你真去了谁拦得住你呢,不用给自己扣帽子,我也是我家第一代大学生啊,农村人,高考96个志愿我就填50多个计算机,爸妈让我填满保底我说我不,我就学计算机,上大学了让我考研我说我不考,我就喜欢干活,现在签了offer,他们也释怀,不回家就努力提升自己,就往家里打钱,就开视频,还能怎么样呢,路是自己走的,他们只是希望你能走得好一点,但大部分父母,尤其是农村父母根本帮不了你什么,难道你就不走路了吗,希望能骂醒你,不要想太多做太少。
点赞 评论 收藏
分享
05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
评论
21
2
分享

创作者周榜

更多
牛客网
牛客企业服务