【js刷题--树】JZ37 序列化二叉树

描述
请实现两个函数,分别用来序列化和反序列化二叉树,不对序列化之后的字符串进行约束,但要求能够根据序列化之后的字符串重新构造出一棵与原二叉树相同的树。

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

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

序列化基本思路
1、首先要规定好每个节点用“#”隔开
2、定义一个空字符串,往里放每一个循环出来的值 + ‘!’
3、定义一个数组,临时存放各个节点,在取出它里,放入它的左右节点
**note:**2、3两步放在一起做,在取出每个节点时,将它的值放入字符串
4、循环边界:当定义的数组里面不再有节点时,也就结束了
5、返回这个数组

反序列化基本思路
1、先将字符串用‘!’隔开,用split()隔成数组,需要注意,因为最后一个也是!,所以需要将最后的空元素pop出来
2、循环开始前,先将数组第一个元素放入arr中,以便后面对左右子树push的处理
3、定义一个循环边界,let i = 1,当字符串分隔成的数组一直大于i时,则不停循环
4、左子树不为空,则放入root.left中,为空,则不管;右子树同理
5、最后返回root即可

function TreeNode(x) {
    this.val = x;
    this.left = null;
    this.right = null;
}
function Serialize(pRoot)
{
    // write code here
    let arr = []
    let str = pRoot.val + '!'
    if(!pRoot) return ''
    arr.push(pRoot)
    while(arr.length!=0){
        let node = arr.shift()
        if(node.left){
            arr.push(node.left)
            str += node.left.val + '!'
        }
        if(!node.left){
            str += '#!'
        }if(node.right){
            arr.push(node.right)
            str += node.right.val + '!'
        }if(!node.right){
            str += '#!'
        }
    }
    return str
}
function Deserialize(s)
{
    // write code here
    if(!s) return null
    //将s从字符串变为数组
    s = s.split('!')//此时数组的最后一个元素会是一个空元素
    s.pop()
    //新定义的树节点需要将字符串转化为数字
    let root = new TreeNode(s[0])
    let arr = [root]
    let i = 1
    while(s.length>i){
        let node = arr.shift()
        if(s[i] !== '#'){
            node.left = new TreeNode(Number(s[i]))
            arr.push(node.left)
        }
        i++
        if(s[i] !== '#'){
            node.right = new TreeNode(Number(s[i]))
            arr.push(node.right)
        }
        i++
    }
    return root
}
module.exports = {
    Serialize : Serialize,
    Deserialize : Deserialize
};

你可能感兴趣的:(数据结构,javascript,算法)