树的序列化和反序列化之三

树的序列化和反序列化之三

一颗普通树进行序列化和反序列化的算法,第三次写这个算法了,感觉更精简了

测试用例:

        Client ct = new Client();
        TreeNode tn = ct.unserialize("1;2,3,4;null:5,6:null;null:7,8");
        System.out.println(ct.serializeTree(tn));
import java.util.List;
import java.util.ArrayList;

public class TreeNode {
    public int val;
    public List<TreeNode> childs;
    public TreeNode(int x) { 
        val = x;
    }
}

    public String serializeTree(TreeNode node) {
        Queue<TreeNode> outQueue = new LinkedList<>();
        outQueue.offer(node);
        String result = node.val + ";";
        while(!outQueue.isEmpty()){
            Queue<TreeNode> inQueue = new LinkedList<>();
            while(!outQueue.isEmpty()){
                inQueue.offer(outQueue.poll());
            }
            String rowStr = "";
            boolean isActivedRow = false;
            while(!inQueue.isEmpty()){
                TreeNode oneNode = inQueue.poll();
                //每次都是处理oneNode的儿子节点
                List<TreeNode> childs = oneNode.childs;
                if(childs != null){
                    for(TreeNode c : childs){
                        rowStr += c.val + ",";
                        //把子节点加入queue中
                        outQueue.offer(c);
                        if(!isActivedRow && c != null){
                            isActivedRow = true;
                        }
                    }
                }else{
                    rowStr += "null,";
                }
                //分号结尾
                rowStr = rowStr.substring(0, rowStr.length() - 1) + ":";
            }
            //每一行是分号结尾,如果下一轮没有有效的节点则清空outQueue,并不加入到result中
            if(isActivedRow){
                result += rowStr.substring(0, rowStr.length() - 1) + ";";
            }
        }
        result = result.substring(0, result.length() - 1);
        return result;
    }

    public TreeNode unserialize(String str){
        String[] strs = str.split(";");
        //实例化根节点
        TreeNode root = new TreeNode(Integer.valueOf(strs[0]));
        //遍历
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        int len = strs.length;
        for(int i = 1; i < len; i++){
            String rowStr = strs[i];
            String[] rowStrs = rowStr.split(":");
            for(String groupStr : rowStrs){
                TreeNode parentNode = queue.poll();
                if("null".equals(groupStr)){
                    continue;
                }
                String[] groupStrs = groupStr.split(",");
                for(String e : groupStrs){
                    TreeNode eNode = new TreeNode(Integer.valueOf(e));
                    if(parentNode.childs == null){
                        parentNode.childs = new ArrayList<>();
                    }
                    parentNode.childs.add(eNode);
                    queue.offer(eNode);
                }
            }
        }
        return root;
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值