序列化二叉树[困难][树\队列\广度优先搜索]

164 阅读2分钟

序列化二叉树 - LeetCode

思考过程: 刚开始想到采用深度优先遍历,用二叉树的先序和中序遍历结果,来确定二叉树的序列化, 随后根据两个遍历序列来进行二叉树的重建(反序列化)。

但是与此同时出现的问题如下

如果按照值来进行先序和中序遍历结果的存储,会出现:如果树中的节点出现相同的值,就导致构建树的时候出现歧义,无法得到唯一的答案。

因此采用层序遍历二叉树的方式,对于每一层的节点结构进行存储,如果遇到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));
 */

题解:

面试题37. 序列化二叉树(层序遍历 BFS ,清晰图解) - 序列化二叉树 - 力扣(LeetCode)