题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树。
分析:
如图:
题目实际上就是用序列来表示一棵二叉树,然后还可以根据这个序列重建二叉树。对于上图中的树,以前序遍历为例,先访问到1,然后2,然后4,4的左右子结点都为空,可以用一个特殊字符$替代,所以上图中的二叉树前序遍历表示就是“1,2,4,$,$,$,3,5,$,$,6,$,$”。
重建的时候,访问的第一个结点为根结点,接下来的数字是2,它是根结点的左子结点。接下来的是4,它是2的左子结点。然后遇到两个$,说明4的左右子结点都是NULL。接下来结点回退,访问4的父结点2,又是$,说明2的右子结点是NULL。再返回到根结点,这时候该建立它的右子结点了,下一个数值是3,说明3是根结点的右子结点,剩下的步骤和左子树部分类似。
代码如下:
/**
* 序列化二叉树和反序列化
* 前提:
* 节点都是0-9之间的数字,且不重复
*/
public class BinaryTreeSerialize {
//序列化
public void serialize(BinaryTreeNode root,StringBuffer sb){
if(root == null)
sb.append("$");
else{
sb.append(root.value);
serialize(root.left,sb);
serialize(root.right,sb);
}
}
//反序列化
public void deserialize(BinaryTreeNode root,StringBuffer sb){
StringBuffer temp = sb.deleteCharAt(0);
if(temp != null && temp != new StringBuffer('$')){
root = new BinaryTreeNode(temp.toString().charAt(0));
deserialize(root.left, sb);
deserialize(root.right, sb);
}
}
}
class BinaryTreeNode {
char value;
BinaryTreeNode left;
BinaryTreeNode right;
public BinaryTreeNode(char value) {
this.value = value;
}
}