序列化二叉树
Posted 前端你好
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了序列化二叉树相关的知识,希望对你有一定的参考价值。
题目:请实现两个函数,分别用来序列化和反序列化二叉树。
例子:
输入:[1,2,3,null,null,4,5]
输出:[1,2,3,null,null,4,5]
分析:使用DFS和递归算法结合前序遍历来解答
序列化
(1)深度优先遍历整个二叉树,遇到null就将其序列化一个特殊字符($)
(2)节点与节点之间用,隔开。
反序列化
(1)定义函数 buildTree 用于还原二叉树,传入由序列化字符串转成的 list 数组。
(2)逐个 pop 出 list 的首项,构建当前子树的根节点,顺着 list,构建顺序是根节点 > 左子树 > 右子树。
如果弹出的字符为 "$",则返回 null 节点。
如果弹出的字符是数值,则创建root节点,并递归构建root的左右子树,最后返回root。
解:
序列化
const serialize = (root) => {
if (root == null) { // 遍历到 null 节点
return '$';
}
const left = serialize(root.left); // 左子树的序列化结果
const right = serialize(root.right); // 右子树的序列化结果
return root.val + ',' + left + ','+ right; // 按 根,左,右 拼接字符串
};
反序列化
function TreeNode(val) { // 创建节点
this.val = val;
this.left = this.right = null;
}
const deserialize = (data) => {
const list = data.split(','); // split成数组
const buildTree = (list) => { // 基于list构建当前子树
const rootVal = list.shift(); // 弹出首项,获取它的“数据”
if (rootVal == "$") { // 是$,返回null节点
return null;
}
const root = new TreeNode(rootVal); // 不是$,则创建节点
root.left = buildTree(list); // 递归构建左子树
root.right = buildTree(list); // 递归构建右子树
return root; // 返回当前构建好的root
};
return buildTree(list); // 构建的入口
};
长按关注我吧
以上是关于序列化二叉树的主要内容,如果未能解决你的问题,请参考以下文章