zoukankan      html  css  js  c++  java
  • 二叉树序列化和反序列化

    二叉树序列化和反序列化

    二叉树的序列化和反序列其实很简单。序列化可以暴力的理解为将一颗形象的树型结构压扁成链型结构,这个链型结构可以想象成一列火车,这列火车可以用队列表示,里面每节车厢存储了二叉树的各个节点值和辅助信息(方便反序列); 反序列就是将火车车厢里的东西倒出来,根据其进入车厢的顺序,将节点值和辅助信息有序的排列起来,还原成原来的二叉树。

    eg:

    该二叉树序列化可表示为:

    具体代码实现

    public class Codec {
        // Encodes a tree to a single string.
        public String serialize(TreeNode root) {
    	//第一个辅助信息,他的本质就是如果一个节点没有哪个子节点(左节点或右节点),
    	//这个子节点就用这个辅助信息表示,即占个坑,防止1_12和1_1_2的情况出现
    	if(root == null){
    		return "#_";
    	}
    	//如果该节点的值不为空,则用“_”连接下一个节点信息,res可以理解为火车
    	String res = root.val + "_";
    	//采用递归将所有节点信息装进火车
    	res += serialize(root.left);
    	res += serialize(root.right);
    	return res;
        }
    
        // Decodes your encoded data to tree.
        public TreeNode deserialize(String data) {
            if(data!=null){
    	      //首先用“_”对所有字符串进行分割,得到字符串数组
    	      String[] value = data.split("_");
    	      if(value.length>0){
    			Queue<String> list = new LinkedList<>();
    			//遍历数组
    			for(int i = 0;i!=value.length;i++){
    			      //将数组内容压入队列中
    				list.offer(value[i]);
    			}
    			return reconPreOrder(list);
    	      }
    	}
    	      return null;
        }
          public TreeNode reconPreOrder(Queue<String> list){
                //从队列中弹出所有数组内容
    	    String value = list.poll();
                //如果是“#”代表他的节点值为空
    	    if(value.equals("#")){
    		return null;
    	    }
    	    //将字符串转为整形,并把它建成树
    	    Node head = new Node(Integer.valueOf(value));
    	    head.left = reconPreOrder(list);
    	    head.right = reconPreOrder(list);
    	    return head;
          }
    }
    
  • 相关阅读:
    DOM事件
    DOM样式操作
    asp.net-枚举绑定控件
    微信站点 点击 “退回” 按钮退回到主菜单
    阻止iOS中页面弹性回滚,只允许div.phone_body的区块有弹性
    asp.net 微信开发失效汇总
    ECharts使用心得
    PV、UPV、UV简介
    微信浏览器取消缓存的方法
    Visual Studio 2015简体中文企业版/专业版下载+有效激活密钥
  • 原文地址:https://www.cnblogs.com/leiger/p/13141951.html
Copyright © 2011-2022 走看看