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

    offer_61

    概要:序列化二叉树
    题目描述

    请实现两个函数,分别用来序列化和反序列化二叉树 
    
    
    
    
    二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
    

    二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

    例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树 
    

    思路:

    如果二叉树的序列化是从根节点开始的,那么相应的反序列化在根节点的数值读出来的时候就可以开始了。因此,我们可以根据前序遍历的顺序来序列化二叉树,因为前序遍历是从根节点开始的。在遍历二叉树碰到nullptr指针时,这些nullptr指针序列化为一个特殊的字符(如$)。
    另外,节点的数值之间要用一个特殊字符(如,)隔开。

    image-20200816131220043

    image-20200816131252349

    图片

    参考

    https://www.cnblogs.com/lishanlei/p/10707645.html

    https://www.cnblogs.com/ygj0930/p/6611039.html

    代码实现:

    /*
    public class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    */
    public class Solution {
        String Serialize(TreeNode root) {
            //序列化,就用前序遍历,再遍历过程中,用“,”分开每个值,然后用“$”代表null
            StringBuilder builder= new StringBuilder();//建立一个builder缓冲流
            IndexOrder(root,builder);//前序遍历
            return builder.toString();//返回结果
      }
        //前序遍历
        void IndexOrder(TreeNode root, StringBuilder builder){
            if(root == null) builder.append("$,");//如果当前结点时空,就再builder中添加这个符号
            else{//如果不是空,注意这个地方的else不能省略,是属于这种情况,不要丢了,如果丢了的话就时空指针异常,因为会再往后面递归
            builder.append(root.val+",");//添加当前遍历的值,并且在后面加符号分隔
            IndexOrder(root.left,builder);//向左递归
            IndexOrder(root.right,builder);//向右递归
            }
        }
       int  index = -1;
        TreeNode Deserialize(String str) {
           String[] perVal = str.split(",");//通过约定的符号进行分割,变成数组
            
            TreeNode node = null;//定义一个节点
            index++;//角标++
            if(!perVal[index].equals("$")){//只要 当前不是空
                node = new TreeNode(Integer.valueOf(perVal[index]));//当前结点就是数组的第一个值,也是根节点,这还是走的前序遍历
                node.left = Deserialize(str);//向左递归
                node.right = Deserialize(str);//向右递归
            }
            //如果到了空,就开始回退到上一层,也就相当于换方向了
            return node;
            
      }
    }
    

    总结

    前序遍历来序列化,然后再用前序遍历来反序列化。类似于负负得正的感觉,只不过再每次的遍历中对遍历中的操作时不一样的

  • 相关阅读:
    代码校验工具 SublimeLinter 的安装与使用
    java中写sql语句的小小细节
    搭建Hexo博客并部署到Github
    更改npm全局模块和cache默认安装位置
    笔记本连接老式显示器(VGA线+HDMI接口)
    用JSON-server模拟REST API
    使用 Feed43
    Coding.net+Myeclipse 2014 Git配置
    line-height 属性
    border-style 属性
  • 原文地址:https://www.cnblogs.com/SunAlbert/p/13512236.html
Copyright © 2011-2022 走看看