【剑指offer】061-序列化二叉树

题目

请实现两个函数,分别用来序列化和反序列化二叉树

二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

思路

先序、中序、后序、层序遍历都可以,但是序列化的时候使用什么遍历方式,反序列化的时候就要使用相应的遍历方式去重构树。

注意:需要注意#点的处理

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/* function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
} */
function Serialize (pRoot{
  // write code here
  if (!pRoot) return '#!'
  let str = ''
  let queue = []
  queue.push(pRoot)
  while (queue.length) {
    let item = queue.shift()
    if (!item) {
      str += '#!'
      continue
    } else {
      str += `${item.val}!`
    }
    queue.push(item.left)
    queue.push(item.right)
  }
  return str
}
function Deserialize (s{
  // write code here
  let nodes = s.split('!')
  if (nodes[0] === '#'return null
  nodes.pop()
  let pRoot = new TreeNode(Number(nodes.shift()))
  let queue = [pRoot]
  while (queue.length) {
    let item = queue.shift()
    let left = nodes.shift()
    let right = nodes.shift()
    if (left !== '#') {
      item.left = new TreeNode(Number(left))
      queue.push(item.left)
    }
    if (right !== '#') {
      item.right = new TreeNode(Number(right))
      queue.push(item.right)
    }
  }
  return pRoot
}
文章作者: ptp
文章链接: https://youyingjie114.github.io/2019/11/07/jz-offer/jz-offer-061/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PTP'S BLOG