Tree serialize & deserialize

189 阅读1分钟

需求

将 Tree 序列化后再反序列化还原
树结构如下:

class TreeNode {
  public val: Number;
  public left: TreeNode | null;
  public right: TreeNode | null;

  constructor(val: Number) {
    this.val = val;
    this.left = this.right = null;
  }
}

思路

树序列化需要经过遍历
选定一种遍历:前序遍历
序列化的过程需要考虑两个,一个是元素本身的分隔,一个 null 的标识

  • 元素本身需要一个标识,','
  • null 的标识,'~'
  • 遍历顺序:根+左+右(类似情况递归即可)

Show Code

// 序列化-前序遍历
const serialize = (root: TreeNode | null): string => {
  if(root === null) {
    return '~'; // flag
  }
  return root.val + ',' + serialize(root.left) + ',' + serialize(root.right)
}
// 反序列化-前序遍历
const deserialize = (val: string): TreeNode | null => {
  const data = val.split(',');
  const _walk = (arr: string[]) => {
    if(!arr.length) return null;
    const cur = arr.shift();
    if(cur === '~') return null;

    const node = new TreeNode(Number(cur));
    node.left = _walk(arr);
    node.right = _walk(arr);
    return node;
  }
  return _walk(data);
}
// test
/**
数据源
TreeNode {
  val: 1,
  right: TreeNode {
    val: 3,
    right: TreeNode { val: 5, right: null, left: null },
    left: TreeNode { val: 4, right: null, left: null }
  },
  left: TreeNode { val: 2, right: null, left: null }
}
序列化
1,2,~,~,3,4,~,~,5,~,~
 */
const node = new TreeNode(1);
node.left = new TreeNode(2);
node.right = new TreeNode(3);
node.right.left = new TreeNode(4);
node.right.right = new TreeNode(5);

console.log(node)
console.log(serialize(node))  // 1,2,~,~,3,4,~,~,5,~,~
console.log(deserialize(serialize(node)))