解前困扰:

1、序列化的,用到了前序遍历,比较简单,所有没有什么好讲的,就是要注意:判断“#”和return少写了。

2、反序列化方面的:

1)不知道如何创造TreeNode,还有与str的关系是怎样的?

啊哈:递归函数每次都是返回一个new出来的TreeNode,str就是要传入的参数,只有一个!

2)它是如何驱动str递进的呢?刚开始如何运作?

啊哈:因为只有#和数字两种情况,所以,直接用index++驱动判断

解题思路:主要讲解反序列化

1、解析空节点

判断当前index下的字符串是否是“#”,是直接return null,同时 index++;

2、 解析非空节点

解析出里面的数字,

3、创建非空节点

这里是要主要的,算是一个闭环,通过这里知道已经解析完了,创建完了最后一个子节点!!!

import java.util.*;

public class Solution {
    int index = 0;

    String Serialize(TreeNode root) {
        if (root == null) return "#"; //少考虑了空异常的情况
        StringBuffer res = new StringBuffer();
        serializeFunc(root, res);
        return res.toString();
    }

    void serializeFunc(TreeNode root, StringBuffer str) {
        if (root == null) {
            str.append('#');
            return; // 缺少了返回
        }

        str.append(root.val).append('!');

        serializeFunc(root.left, str);
        serializeFunc(root.right, str);
    }

    /**
     * 不知道如何创造TreeNode,还有与str的关系是怎样的?
     * 啊哈:递归函数每次都是返回一个new出来的TreeNode
     */
    TreeNode Deserialize(String str) {
        if ("#".equals(str) || str == null) {
            return null;
        }
        return deserializeFunc(str);
    }

    /**
     * 它是如何驱动str递进的呢?
     * 刚开始如何运作?
     * 啊哈:因为只有#和数字两种情况,所以,直接用index++驱动判断
     */
    TreeNode deserializeFunc(String str) {
        // 解析空节点
        if (str.charAt(index) == '#') {
            index++;
            return null;
        }

        // 解析非空节点
        int num = 0;
        while(str.charAt(index)!='!' && index != str.length()) {
            num = num*10 + str.charAt(index) - '0';
            index++;
        }

        // 创建非空节点
        TreeNode root = new TreeNode(num);
        // 这里是要主要的,算是一个闭环,通过这里知道已经解析完了,
        // 创建完了最后一个子节点!!!
        if(index == str.length()) { 
            return root;
        } else {
            index ++;
        }
        
        // 递归创建当前节点左右子节点
        root.left = deserializeFunc(str);
        root.right = deserializeFunc(str);

        return root;
    }

}