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;
            
      }
    }
    

    总结

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

  • 相关阅读:
    HDOJ 1846 Brave Game
    并查集模板
    HDU 2102 A计划
    POJ 1426 Find The Multiple
    POJ 3278 Catch That Cow
    POJ 1321 棋盘问题
    CF 999 C.Alphabetic Removals
    CF 999 B. Reversing Encryption
    string的基础用法
    51nod 1267 4个数和为0
  • 原文地址:https://www.cnblogs.com/SunAlbert/p/13512236.html
Copyright © 2011-2022 走看看