参考自ConardLi: 《对称的二叉树》 公众号: code秘密花园

如下二叉树:

      8     / \    6   6   /\   /\  5  7 7  5

按照前序遍历序列化出来的结果为: 8,6,5,#,#,7,#,#,6,7,#,#,5,#,#
反序列化:按规定的字符串输出二叉树

思路:
1.如果二叉树是一颗完全二叉树,只需知道前序遍历即可重建
2.在序列化二叉树时,可以将空节点使用特殊符号存储起来,这个就可以模拟一颗完全二叉树的前序遍历
3.在重建二叉树时,当遇到特殊符号当空节点进行处理

步骤1:模拟一个二叉树

const symmetricalTree = {  val: 8,  left: {    val: 6,    left: { val: 5, left: null, right: null },    right: { val: 7, left: null, right: null }  },  right: {    val: 6,    left: { val: 7, left: null, right: null },    right: { val: 5, left: null, right: null }  }}

步骤2:

//序列化function Serialize(pRoot, arr = []) {  if (!pRoot) {    arr.push('#');  } else {    arr.push(pRoot.val);    Serialize(pRoot.left, arr);    Serialize(pRoot.right, arr);  }  return arr.join(',');}

步骤3:

//反序列化function Deserialize(str) {  if (!str) {    return null;  }  return deserialize(str.split(','));}function deserialize (arr) {  let node = null;  const current = arr.shift();  if (current !== '#') {    node = { val: current };    node.left = deserialize(arr);    node.right = deserialize(arr);  }  return node;}

输出

console.log(Serialize(symmetricalTree));console.log(Deserialize('8,6,5,#,#,7,#,#,6,7,#,#,5,#,#'));

结果如下:

8,6,5,#,#,7,#,#,6,7,#,#,5,#,#{ val: '8',  left:   { val: '6',     left: { val: '5', left: null, right: null },     right: { val: '7', left: null, right: null } },  right:   { val: '6',     left: { val: '7', left: null, right: null },     right: { val: '5', left: null, right: null } } }

参考自ConardLi: 《对称的二叉树》 公众号: code秘密花园