请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
示例:
输入:root = [1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/**
* Definition for a binary tree node.
* function TreeNode(val) {
* this.val = val;
* this.left = this.right = null;
* }
*/
/**
* Encodes a tree to a single string.
*
* @param {TreeNode} root
* @return {string}
*/
var serialize = function(root) {
// 变成字符串 其实就是2叉树遍历
const queue = [root];
let res = [];
while (queue.length) {
const node = queue.shift(); // 考察出列的节点
if (node) { // 是真实节点,带出子节点入列
res.push(node.val); // 节点值推入res
queue.push(node.left); // 子节点入列,不管是不是null节点都入列
queue.push(node.right);
} else { // 是null节点,没有子节点入列
res.push('X'); // X 推入res
}
}
console.log(res)
return res.join(','); // 转成字符
};
/**
* Decodes your encoded data to tree.
*
* @param {string} data
* @return {TreeNode}
*/
var deserialize = function(data) {
if (data == 'X') return null;
let list = data.split(',');
const root = new TreeNode(list[0]); // 获取首项,构建根节点
let queue = [root]
let cur = 1;
while(cur < list.length) {
let node = queue.shift();
let left = list[cur];
let right = list[cur+1];
if (left != 'X') {
const leftNode = new TreeNode(left); // 创建左儿子节点
node.left = leftNode; // 认父亲
queue.push(leftNode); // 自己也是父亲,入列。
}
if (right != 'X') {
const rightNode = new TreeNode(right); // 创建左儿子节点
node.right = rightNode; // 认父亲
queue.push(rightNode); // 自己也是父亲,入列。
}
cur+=2
}
return root
};
/**
* Your functions will be called as such:
* deserialize(serialize(root));
*/