二叉树的序列化与反序列化

题目链接

二叉树的序列化与反序列化

题目描述

二叉树的序列化与反序列化_第1张图片
二叉树的序列化与反序列化_第2张图片

注意点

  • 可采取任意方式序列化与反序列化
  • 树中结点数在范围 [0, 104] 内

解答思路

  • 可以通过深度优先遍历或广度优先遍历进行序列化和反序列化,进行序列化和反序列化思想是相同的
  • 采用深度优先遍历解决,但是要注意和平常深度优先遍历不同的点在于子树为null时也要写进结果里,方便后续反序列化建立树

代码

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Codec {

    // Encodes a tree to a single string.
    public String serialize(TreeNode root) {
        StringBuilder sb = new StringBuilder();
        dfs(root, sb);
        sb.deleteCharAt(sb.length() - 1);
        return sb.toString();
    }

    public void dfs(TreeNode root, StringBuilder sb) {
        if (root == null) {
            sb.append("null").append(",");
            return;
        }
        sb.append(root.val).append(",");
        dfs(root.left, sb);
        dfs(root.right, sb);
    }

    // Decodes your encoded data to tree.
    public TreeNode deserialize(String data) {
        if ("null".equals(data)) {
            return null;
        }
        String[] arr = data.split(",");
        Queue<String> queue = new LinkedList<>();
        for (String str : arr) {
            queue.offer(str);
        }
        return buildTree(arr, queue);
    }

    public TreeNode buildTree(String[] arr, Queue<String> queue) {
        if (queue.isEmpty()) {
           return null;
        }
        if ("null".equals(queue.peek())) {
            queue.poll();
            return null;
        }
        TreeNode root = new TreeNode();
        String tmp = queue.poll();
        root.val = Integer.parseInt(tmp);
        root.left = buildTree(arr, queue);
        root.right = buildTree(arr, queue);
        return root;
    }
}

// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

关键点

  • 深度优先遍历的过程
  • 对于为null的子树也要写进结果中
  • 反序列化建立树时使用队列存储节点,利用队列先进先出的特性,将节点按顺序弹出

你可能感兴趣的:(算法TOP100,深度优先,算法,leetcode,数据结构)