zoukankan      html  css  js  c++  java
  • 剑指61.序列化二叉树

    题目描述

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

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

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

    思路

    思路1:前序遍历递归。

    思路2:前序遍历非递归。

    思路3:层序遍历。

     

    解法1 (前序遍历递归)

    /*
    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 node) {
            StringBuilder sb = new StringBuilder();
            if (node == null){
                sb.append("#!");  // 用#表示空节点
            }else{
                sb.append(node.val + "!");
                sb.append(Serialize(node.left));
                sb.append(Serialize(node.right));
            }
            return sb.toString();
        }
        // 反序列化写法1:利用substring截取字符串
        // 注意:数值可能不只是个位数字,定义全局变量index(在字符串上的移动的指针),便于截取字符串中当前的结点值。
        int index = 0;
        TreeNode Deserialize(String str) {
            TreeNode node = null;
            if (str == null || str.length() == 0)
                return node;
            int start = index;
            while (str.charAt(index) != '!'){
                index++;
            }
            if (!str.substring(start,index).equals("#")) {// substring前闭后开
                node = new TreeNode(Integer.parseInt(str.substring(start,index)));
                index++; // 位置别放错了,插入一个节点后,index++,然后再递归
                node.left = Deserialize(str);
                node.right = Deserialize(str);
            }else{
                index++;
            }
            return node;
        }
    
        //反序列化写法2:使用split()转化为字符串数组
        /*int index = 0; // 设置全局主要是遇到了#号的时候需要直接前进
        TreeNode Deserialize(String str){
            if (str == null || str.length() == 0)
                return null;
            String[] temp = str.split("!"); // 指定分隔符
            TreeNode node = null;
            if (temp[index].equals("#")){
                index++;
            }else{
                node = new TreeNode(Integer.parseInt(temp[index]));
                index++;
                node.left = Deserialize(str);
                node.right = Deserialize(str);
            }
            return node;
        }*/
    }
     

    收获

    String转int类型时,Integer.parseInt(str) 与 Integer.valueOf(str)区别:

    • Integer.parseInt() 返回的是一个int的值。
    • new Integer.valueof()返回的是Integer的对象。
     
     
     
    参考:
     
     
     
  • 相关阅读:
    0是字符串的终止符
    c语言中获取数组的长度写法
    c语言第一个程序
    linux下adb连接不上解决方法
    android的apk权限查看
    dumpsys netpolicy中state的含义
    查看ps和dumpsys netpolicy
    批量安装/卸载手机apk--python语言
    【转载】Think as Customer 以客户为中心的测试理念
    利用xampp进行https操作
  • 原文地址:https://www.cnblogs.com/HuangYJ/p/13632528.html
Copyright © 2011-2022 走看看