剑指offer第二版面试题37:序列化二叉树(java)

题目描述:
请实现两个函数,分别用来序列化和反序列化二叉树。

分析:
如图:
这里写图片描述

题目实际上就是用序列来表示一棵二叉树,然后还可以根据这个序列重建二叉树。对于上图中的树,以前序遍历为例,先访问到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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_37672169/article/details/80565587