LC 297. 二叉树的序列化与反序列化 || JZ61 序列化二叉树

人话   二叉树转成字符串,字符串能还原该二叉树

官解的这种方式应该是自顶向下遍历,遍历过程记录节点 

另外也可以自底向上建树

 自底向上和自顶向下的区别和适用范围?先占坑。看看后面题有没碰到的

题看了很久,题解也看了好几家,还是基础不牢,先知道怎么建树

实际上题目已经提示了,剩下就是建树的过程了 

import java.util.*;
public class Solution {
    String Serialize(TreeNode root) {
        if(root==null)
            return "None,";
        String leftStr=Serialize(root.left);//这里不需要+“,”,从底下往上返回都是带了“,"
        String rightStr=Serialize(root.right);//加了",", 存在两个逗号就会分割出空串
        return root.val+","+leftStr+rightStr;
  }
    TreeNode Deserialize(String str) {
       if(str==null||str.length()==0)
           return null;
       String strs[] = str.split(",");
       Queue<String> queue = new LinkedList<>(Arrays.asList(strs));
        return reBuild(queue);
  }
    TreeNode reBuild(Queue<String> queue)
    {
        if(queue.isEmpty())
            return null;
        String str=queue.poll();
        if(str.equals("None"))//==是对象的比较用equals
            return null;
        TreeNode root=new TreeNode(Integer.parseInt(str));
        root.left=reBuild(queue);
        root.right=reBuild(queue);
        return root;
    }
}

思路二:bfs

反序列化过程:

将字符串生成队列strNodes

队列queue作为下一层的父节点,用于 子节点与父节点的拼接 【想想层序遍历的过程】

public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root==null)
            return "None";
        StringBuilder str = new StringBuilder();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        while(!queue.isEmpty())
        {
                TreeNode node = queue.poll();
                if(node!=null)
                {
                    str.append(node.val+",");                    
                    queue.offer(node.left);
                    queue.offer(node.right);
                }
                else
                    str.append("None,");
        }
        return str.toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data==null||data.length()==0||data=="None")
           return null;
        String strs[] = data.split(",");
        Queue<String> strNodes = new LinkedList(Arrays.asList(strs));
        Queue<TreeNode> queue = new LinkedList<>();
        TreeNode root = new TreeNode(Integer.parseInt(strNodes.poll()));
        queue.add(root);
        while(!queue.isEmpty())
        {
                TreeNode node=queue.poll();
                String left=strNodes.poll();
                String right=strNodes.poll();
                if(!"None".equals(left))
                {
                    node.left=new TreeNode(Integer.parseInt(left));
                    queue.add(node.left);
                }
                if(!"None".equals(right))
                {
                    node.right=new TreeNode(Integer.parseInt(right));
                    queue.add(node.right);
                }
        }
        return root;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_40396568

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值