二叉树的序列化和反序列化 | 刷题打卡

118 阅读1分钟

题目描述

你能否对二叉树进行序列化和反序列化?就像 JSON.stringify()JSON.parse() 所做的那样。题目链接

const tree1 = ...
expect(typeof serialize(tree1)).toBe('string')

const tree2 = deserialize(serialize(tree1)) 
expect(isIdentical(tree1, tree2)).toBe(true)

思路分析

我们需要完成两个任务,序列化和反序列化

class Node {
  value: string
  left: null | Node
  right: null | Node
  constructor(val) {		<=>		[1,2,3,4,null,null,5,6,7,8,null,null,null,null,9]
    this.value = val
    this.left = null
    this.right = null
  }
}

序列化只需要对 Node 深度优先遍历即可

function serialize(node) {
    if (!root) {
        return 'null';
    }
    
    return `${root.value}, ${serialize(root.left), ${serialize(root.right)}}`;
}

反序列化,可以通过观察序列化的数组 [1,2,3,4,null,null,5,6,7,8,null,null,null,null,9]
从第0个开始,对应的value left right 分别为1、2、3,说明核心函数是把数组第0项作为 value,第1项作为 left.value,第2项作为 right.value,第3项作为left.left.value
因此我们每一次操作都是赋值value,并且取出队列中的第0项

function deserialize(str) {
    const q = str.split(',');

    return dfs(q);

    function dfs(que) {
        if (!que.length) {
            return null;
        }
        const n = que.shift();
        if (n !== 'null') {
            const node = new Node(n);
            node.left = dfs(que);
            node.right = dfs(que);
            return node;
        }
        return null;
    }
}

AC代码

// class Node {
//   value: number
//   left: null | Node
//   right: null | Node
//   constructor(val) {
//     this.value = val
//     this.left = null
//     this.right = null
//   }
// }

/**
 * @param {Node} root
 * @return {string}
 */
function serialize(root) {
    if (!root) {
        return 'null';
    }

    return `${root.val},${serialize(root.left)},${serialize(root.right)}`;
}

/**
 * @param {string} str
 * @return {Node}
 */
function deserialize(str) {
    const q = str.split(',');

    return dfs(q);

    function dfs(que) {
        if (!que.length) {
            return null;
        }
        const n = que.shift();
        if (n !== 'null') {
            const node = new Node(n);
            node.left = dfs(que);
            node.right = dfs(que);
            return node;
        }
        return null;
    }
}

总结

处理二叉树问题,可以利用 array.shift() 这样保证取出第0项并且取出原数据第0项 本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情