二叉树的基础算法:序列化和反序列化

96 阅读1分钟

二叉树的序列化和反序列化

  1. 前序方法
  2. 中序❌,无法完成
  3. 后序方法
  4. 层序遍历方法

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);
};