BM39 题解 | #序列化二叉树#
序列化二叉树
https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
解前困扰:
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;
}
}
查看12道真题和解析
