一、题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二、解题思路
序列化时:将该二叉树以先序遍历(中、后和层序遍历都可以,这里以先序遍历为例),如果结点是空的就放入“#!”,如果结点 不是空的就在结点末尾加入“!”即可。这样就形成了一个字符串。
反序列化时:将该字符串用“!”分割开,放到数组里,在将数组转换成二叉树,注意结点空时,对应的数组元素的值是“#”。
三、java代码
public class Solution_62 {
/**
* 请实现两个函数,分别用来序列化和反序列化二叉树
*/
String Serialize(TreeNode root) {
StringBuffer res = new StringBuffer("");
this.preOrder(root, res);
return res.toString();
}
void preOrder(TreeNode root,StringBuffer str){
if(root == null){ //递归结束条件
str.append("#!");
return;
}
//前序遍历
str.append(root.val+"!");
this.preOrder(root.left, str);
this.preOrder(root.right, str);
}
TreeNode Deserialize(String str) {
if(str == null || str.length()<=0)
return null;
String [] strs = str.split("!");
TreeNode root = this.deSerializeCore(strs);
return root;
}
int index = 0;
TreeNode deSerializeCore(String [] strs){
if("#".equals(strs[index])){
index ++;
return null;
}else{
TreeNode newNode = new TreeNode(0);
newNode.val = Integer.parseInt(strs[index]);
index ++;
newNode.left = this.deSerializeCore(strs);
newNode.right = this.deSerializeCore(strs);
return newNode;
}
}
}