61序列化二叉树

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

代码实现

序列化

注意要点

  • 每序列化一个结点数值后,都应加上一个结束符表示一个结点序列化的终止,包括空结点。如_或!
  • 用一个占位符表示空结点的序列化,如#
/**
 * 前序序列化
 * 为空则#,两数之间间隔用!
 *
 * @param head
 * @return
 */
public String Serialize(TreeNode root) {
    if (root == null) {
        return "#!";
    }
    String res = root.val + "!";
    res += Serialize(root.left);
    res += Serialize(root.right);
    return res;
}

重建

注意要点

怎么序列化,就怎么反序列化

/**
 * 从前序序列化字符串重建整个二叉树
 *
 * @param str
 * @return
 */
public static TreeNode Deserialize(String str) {
    String[] strings = str.split("!");
    Queue<String> queue = new LinkedList<>();
    for (String tmp : strings) {
        queue.offer(tmp);
    }
    return reConByPreOrder(queue);
}

public static TreeNode reconByPreOrder(Queue<String> queue) {
    //依次出队元素重建结点
    String value = queue.poll();
    //重建空结点,为#直接返回
    if (value.equals("#")) {
        return null;
    }
    //重建头结点和左右子树
    Node head = new TreeNode(Integer.valueOf(value));
    head.left = reconByPreOrder(queue);
    head.right = reconByPreOrder(queue);
    return head;
}
发布了118 篇原创文章 · 获赞 8 · 访问量 3715

猜你喜欢

转载自blog.csdn.net/qq_34761012/article/details/104476551