思考过程: 刚开始想到采用深度优先遍历,用二叉树的先序和中序遍历结果,来确定二叉树的序列化, 随后根据两个遍历序列来进行二叉树的重建(反序列化)。
但是与此同时出现的问题如下
如果按照值来进行先序和中序遍历结果的存储,会出现:如果树中的节点出现相同的值,就导致构建树的时候出现歧义,无法得到唯一的答案。
因此采用层序遍历二叉树的方式,对于每一层的节点结构进行存储,如果遇到null节点也将其进行记录,得到
1 2 3 null null 4 5 null null null null
这样的序列,实现序列化。
随后进行反序列化,构建二叉树,依次从根节点,根节点的左孩子、右孩子来进行构建,同时开辟一个数组arr记录层序构造的节点,如遇到null,将对应的要放置的节点置为空,同时不加入数组arr。
代码:
/**
* 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) { // 层序遍历
let arr = new Array()
if(root == null){ return "" }
let queue = new Array()
queue.push(root)
while(queue.length > 0){
const front = queue.shift()
if(front){
arr.push(front.val)
queue.push(front.left)
queue.push(front.right)
}else{
arr.push('null')
}
}
return arr.join(" ")
};
/**
* Decodes your encoded data to tree.
*
* @param {string} data
* @return {TreeNode}
*/
var deserialize = function(data) {
if(data == "") return null
// 准备所需变量
const arr = data.split(" ")
const node_arr = new Array()
let pointer = 0
node_arr.push(new TreeNode(arr[0]*1))
let left = true
for(let i = 1; i < arr.length; i++){
let target = null
if(arr[i] != 'null'){
target = new TreeNode(arr[i]*1)
node_arr.push(target)
}
if(left){
node_arr[pointer].left = target
}else{
node_arr[pointer++].right = target
}
left = !left
}
return node_arr[0]
};
/**
* Your functions will be called as such:
* deserialize(serialize(root));
*/
题解: