二叉树的序列化

差不多搞了两个半小时,终于出来了,目前最大的问题是 在LeetCode上不停的调试和试错,才能得出最终答案,在敲代码的过程中会犯各种各样的毛病,而且对二叉树的序列化不是很清楚,判别条件上也总是出错,总之就是很菜
使用的是层序遍历,也就是BFS

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        if(root==null){
            return null;
        }
        StringBuilder sb=new StringBuilder();
        Deque<TreeNode> deque=new LinkedList<>();
        deque.add(root);
        sb.append(root.val+",");
        
        while(deque.size()!=0){
            int size=deque.size();
           
            for(int i=0;i<size;i++){
                
                TreeNode node=deque.poll();
                if(node.left!=null){
                    deque.add(node.left);
                    sb.append(node.left.val+",");
                }else{
                   
                    // deque.add(new TreeNode(1));
                    sb.append("#"+",");
                }
                if(node.right!=null){
                    deque.add(node.right);
                    sb.append(node.right.val+",");
                }else{
                   
                    // deque.add(new TreeNode(1));
                    sb.append("#"+",");
                }
            }
            if(count==fbei){
                break;
            }
            count=0;
        }
        // System.out.print(count);
        System.out.print(sb.substring(0,sb.length()-count*2-1));
        return sb.substring(0,sb.length());
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if(data==null){
            return null;
        }
         String[] str=data.split(",");
        if(str.length==0){
            return null;
        }
        TreeNode ref=new TreeNode(Integer.valueOf(str[0]));
        TreeNode tree=ref;
        int start=1;
        Deque<TreeNode> deque=new LinkedList<>();
        deque.add(ref);
        while(start<str.length&&deque.size()!=0){
            TreeNode node=deque.poll();
            if(start<str.length&&!str[start].equals("#")){
                node.left=new TreeNode(Integer.valueOf(str[start]));
                deque.add(node.left);
            }
            start++;
            if(start<str.length&&!str[start].equals("#")){
                flag=true;
                node.right=new TreeNode(Integer.valueOf(str[start]));
                deque.add(node.right);
            }
            start++;
        }
        return tree;
        
    }
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));

深度遍历代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {

    // Encodes a tree to a single string.
    public StringBuilder rserialize(TreeNode root,StringBuilder sb){
        if(root==null){
            sb.append("#,");
            return sb;
        }
        sb.append(root.val+",");
        rserialize(root.left,sb);
        rserialize(root.right,sb);
        return sb;
        
    }
    public String serialize(TreeNode root) {
        return rserialize(root,new StringBuilder()).toString();
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if((data.charAt(0)+"").equals("#")){
            return null;
        }
        String[] str=data.split(",");
        List<String> list=new ArrayList<>(Arrays.asList(str));
        return rdeserialize(list);
    }
    public TreeNode rdeserialize(List<String> list){
        if(list.get(0).equals("#")){
            list.remove(0);
            return null;
        }
        TreeNode root=new TreeNode(Integer.valueOf(list.get(0)));
        list.remove(0);
        root.left=rdeserialize(list);
        root.right=rdeserialize(list);
        return root;
    }
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值