37.序列化二叉树
题目
请实现两个函数,分别用来序列化和反序列化二叉树。
你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
提示:输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
思路
思路其实不复杂,从根节点开始遍历,将树的结构转变为一个字符串, return root.val + ',' + serialize(root.left) + serialize(root.right)
看这个返回值,其实是一个类似前序遍历的结果。
然后反序列化,其实就是依然根据类似前序遍历这么一个顺序,将字符串的值从头开始一个个取出来再变为节点。
代码
/**
* 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) {
// 遍历到空节点,转化为井号和逗号
if(!root) {
return '#,'
}
return root.val + ',' + serialize(root.left) + serialize(root.right)
};
/**
* Decodes your encoded data to tree.
*
* @param {string} data
* @return {TreeNode}
*/
var deserialize = function(data) {
let nodes = data.split(',')
function dfs() {
let value = nodes.shift()
if(value === '#') {
return null
}
let node = new TreeNode(value)
node.left = dfs()
node.right = dfs()
return node
}
return dfs()
};
/**
* Your functions will be called as such:
* deserialize(serialize(root));
*/