每日一题(14)

设计一个算法,并编写代码来序列化和反序列化二叉树。

将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。

如果二叉树的序列化是从根节点开始,那么对应的而反序列化也是从根节点开始的。因此可以使用二叉树的前序遍历来序列化二叉树,当前序遍历碰到null值是,使用“#”表示,每一个节点的数值之间用“,”隔开。

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public int index = -1;  // 节点在序列中的索引

    /**
     * 序列化
     * 前序遍历,将二叉树节点的值转为字符序列,null转为“#”
     * 
     * @param root
     * @return
     */
    String Serialize(TreeNode root) {
        StringBuffer s = new StringBuffer();
        if (root == null) {
            s.append("#,");
            return s.toString();
        }
        s.append(root.val + ",");
        s.append(Serialize(root.left));
        s.append(Serialize(root.right));
        return s.toString();
    }

    /**
     * 反序列化
     * 
     * @param str
     * @return
     */
    TreeNode Deserialize(String str) {
        index++;
        int length = str.length();
        if (index >= length) {
            return null;
        }
        String[] nodeSeq = str.split(",");
        TreeNode pNode = null;
        if (!nodeSeq[index].equals("#")) {
            pNode = new TreeNode(Integer.valueOf(nodeSeq[index]));
            pNode.left = Deserialize(str);
            pNode.right = Deserialize(str);
        }
        return pNode;
    }
}

StringBuilder类可以用于在无需创建一个新的字符串对象情况下修改字符串。
在 StringBuilder 上的主要操作是 append 和 insert 方法。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。

猜你喜欢

转载自blog.csdn.net/sifanchao/article/details/81841449