vlambda博客
学习文章列表

二叉树序列化反序列化

所谓序列化也叫持久化,显然序列化需要将每个结点按照一定的顺序转换为字符串,关键是这个顺序是什么顺序,这个顺序其实就是遍历树的顺序,按照遍历结点的顺序将结点转化为字符串即可,因此先序遍历、中序遍历、后序遍历、按层遍历都可以进行序列化。
所谓反序列化是根据一个字符串重新建立一棵二叉树,反序列化是序列化的逆过程,对于一个字符串,首先按照分隔符!将其分割为字符串数组,每个字符串元素代表一个结点,然后开始重建二叉树。由于每个结点再字符串中只保留了一个val值,因此需要根据结点的值val重新构建TreeNode结点对象,并且为这个结点对象的left和right进行赋值。


实现

function serialize(tree){

 var arr=[];

 innerSerialize(tree,arr);

 return arr.join(",");

 

 function innerSerialize(tree,arr){

    if(!tree)

   //占位符,可用其他代替

   arr.push("#");

}else{

   arr.push(tree.value);

   innerSerialize(tree.left,arr);

   innerSerialize(tree.right,arr);

   }

  }

}

function deserialize(serializedTree){

   var arr=seralizedTree.split(",");

   return innerDeserialize();

   function innerDeserialize(){

     if(!arr.length){

       return;

    } 

    var val=arr.shift();

    if(val==="#"){

        return;

     }

    var node={

        value:val

     };

    node.left=innerDeserialize();

    node.right=innerDeserialize();

    

    return node;

  }

}


   var testTree={

     value:1,

     left:{

     value:2

},

     right:{

      value:3,

      left:{

      value:4

    },

    right:{

     value:5

    }

   }

}


var serializedTree=serialize(testTree);

console.log(serializedTree);

var deserializedTree=deserialize(serializedTree);

console.log(deserializedTree);