解前困扰:
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; } }