算法之树的序列化与反序列化

本文探讨了在序列化和反序列化二叉树时的注意事项,特别是针对力扣(LeetCode)的一道题目——序列化二叉树。文章指出,由于先序、中序、后序遍历的不唯一性,通常采用层序遍历来实现序列化。在处理给定的测试用例时,需要理解其树结构特点,避免误解节点关系。在实现过程中,建议使用StringBuilder进行字符串操作以提高效率,并使用Queue而非LinkedList来实现队列,因为Queue接口限制了对LinkedList的非Queue方法的访问,更符合接口设计原则。然而,反序列化过程存在挑战,由于数组表示的树结构不遵循满二叉树的下标关系,可能导致转化错误或不完整。
摘要由CSDN通过智能技术生成

剑指 Offer 37. 序列化二叉树

首先明确遍历的方式,先序,中序,后序遍历可能对应着多种二叉树,导致序列化后不可逆,通常还是使用层序遍历。

还有就是明确这道题力扣给的测试用例所代表的树到底是什么,例如[5,2,3,null,null,2,4,3,1,null,null,null,null,null,null],需要注意第8,9个元素3,1是第6个元素2的子节点,而不是第4个元素null的子节点,即不是按照满二叉树的标准来生成序列的,因此不能直接使用满二叉树的父节点与子节点的下标关系来做这道题。

层序遍历

  1. 注意,字符串的操作如果可以使用StringBuilder就尽量使用StringBuilder,会节省很多很多时间
  2. 新建队列也可以使用Queue queue = new LinkedList<>();

简单说说LinkedList和Queue的区别:
LinkedList实现了Queue接口。Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果是Queue时,就完全只能访问Queue接口所定义的方法 了,而不能直接访问 LinkedList的非Queue的方法),以使得只有恰当的方法才可以使用。
因此,其实用Queue会更规范。

public String serialize(TreeNode root) {
   
        //注意判断根节点是否为空,为空的话直接返回
        if(root==null) return "";
        StringBuilder s=new StringBuilder("");
        //新建一个队列,将根节点入队
        LinkedList<TreeNode> q=new LinkedList<>();
        q.add(root);
        //while循环,判断条件是队列是否为空
        while(!q.isEmpty()){
   
            TreeNode node=q.poll();
            if(node==null){
      //节点为空则打印null
                s.append("null ");
            
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值