二叉树的序列化和反序列化
- 前序方法
- 中序❌,无法完成
- 后序方法
- 层序遍历方法
1. 前序遍历解法
序列化:
- 输入二叉树,返回:"1,#,2,#"
- 正常的前序遍历二叉树
- 二叉树空指针的地方给一个特殊的字符。如"#"
- 返回结果特殊符号分隔, 如:逗号
反序列化:
- 输入:"1,#,2,#", 输出 二叉树
- 将字符串分割成数组
- 遍历数组,构建一棵二叉树
- ’#‘的地方为空指针,
- 第一个shift出来的元素是根节点
- list数组逐渐减少,直到空,停止递归遍历
var serialize = function(root) {
let res = []
const traverse = ((root)=>{
if(root==null){
res.push('#')
return;
}
res.push(root.val);
traverse(root.left);
traverse(root.right);
})
traverse(root)
return res.join();
};
/**
* Decodes your encoded data to tree.
*
* @param {string} data
* @return {TreeNode}
*/
var deserialize = function(data) {
const arr = data.split(',');
const deserializeHelper = ((arr)=>{
if(!arr.length) return null;
var rootVal = arr.shift();
if(rootVal=='#'){
return null;
}
var root = new TreeNode(rootVal);
root.left = deserializeHelper(arr);
root.right = deserializeHelper(arr);
return root;
})
return deserializeHelper(arr)
};
/**
2. 后序遍历解法
序列化:同上,写在后序位置
反序列化:要先遍历右子树,因为后序遍历位置是:左右根
var serialize = function(root) {
// 后序遍历 序列化
let res = [];
const traverse = function(root){
// base
if(root===null){
res.push('#');
return;
}
traverse(root.left);
traverse(root.right);
// 后序
res.push(root.val);
}
traverse(root);
return res.join();
};
/**
* Decodes your encoded data to tree.
*
* @param {string} data
* @return {TreeNode}
*/
var deserialize = function(data) {
var list = data.split(',');
const deserializeHelper = function(list){
// base :如果数组里没有元素了,说明遍历结束了
if(list.length==0) return null;
// 1. 先找到根节点:数组的最后一个
var rootVal = list.pop();
// 如果 这个值是空
if(rootVal==='#'){
return null;
}
var root = new TreeNode(rootVal);
// 此时的list已经是被pop之后的集合了
root.right = deserializeHelper(list);
root.left = deserializeHelper(list);
return root;
}
return deserializeHelper(list);
};