【LeetCode算法学习笔记】序列化和反序列化二叉树

labuladong公众号算法学习笔记


序列化就是把结构化的数据打平,考察二叉树的遍历方式。

前序遍历解法

serialize

在递归遍历两颗子树之前写的代码就是前序遍历代码。

String SEP=",";
String NULL="#";
String serialize(TreeNode root){
    StringBuilder sb = new StringBuilder();
    serialize(root,sb);
    return sb.toString();
}
void serialize(TreeNode root,StringBuilder sb){
    if(root == null){
        sb.append(NULL).append(SEP);
        return;
    }
    sb.append(root.val).append(SEP);
    serialize(root.left,sb);
    serailize(root.right,sb);
}

deserialize

可以把字符串转化成列表,因为这里的列表里包含空指针的信息,所以只使用列表就可以还原二叉树了。
先确定根节点root,然后遵循前序遍历的规则,递归生成左右子树即可。

/*主函数,将字符串反序列化为二叉树结构*/
TreeNode deserialize(String data){
    //将字符串转化成列表
    LinkedList<String> nodes = new LinkedList<>();
    for(String s : data.split(SEP);
    return deserialize(nodes);
}
TreeNode deserialize(LinkedList<String> nodes){
    if(nodes.isEmpty()) return null;
    
    String first = nodes.removeFirst();
    if(first.equals(NULL)) return null;
    TreeNode root = new TreeNode(Integer.parseInt(first));

    root.left = deserialize(nodes);
    root.right = deserialize(nodes);

    return root;
}

后序遍历解法

serialize

void serialize(TreeNode root,StringBuilder sb){
    if(root == null){
        sb.append(NULL).append(SEP);
        return;
    }
    serialize(root.left,sb);
    serialize(root.right,sb);
    sb.append(root.val).append(SEP);
    return;
}

deserialize

首先寻找root节点的值,然后递归计算左右子节点。
由列表可知,从后往前在nodes列表中取元素,一定要先构造root.right子树,然后构造root.left子树。

/*主函数,将字符串反序列化为二叉树结构*/
TreeNode deserialize(String data){
    //将字符串转化成列表
    LinkedList<String> nodes = new LinkedList<>();
    for(String s : data.split(SEP);
    return deserialize(nodes);
}
TreeNode deserialize(LinkedList<String> nodes){
    if(nodes.isEmpty()) return null;
    //从后往前取元素
    String last = nodes.removeLast();
    if(last.equals(NULL)) return null;
    TreeNode root = new TreeNode(Integer.parseInt(last));

    root.right = deserialize(nodes);
    root.left = deserialize(nodes);

    return root;
}

层级遍历解法

遍历框架

void traverse(TreeNode root){
    if(root == null) return;
    //初始化队列加入队伍
    Queue<TreeNode> q = new LinkedList<>();
    q.offer(root);
    while(!q.isEmpty()){
        TreeNode cur = q.poll();
        /*层级遍历*/
        System.out.println(root.val);
        /*层级遍历*/
        if(cur.left != null) q.offer(cur.left);
        if(cur.right != right) q.offer(cur.right);
    }
    
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值