剑指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的对象。
 
 
 
参考:
 
 
 
原文地址:https://www.cnblogs.com/HuangYJ/p/13632528.html