程序员社区

剑指Offer系列(java版,详细解析)37.序列化二叉树

题目描述

剑指 Offer 37. 序列化二叉树

难度困难128

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

示例:

你可以将以下二叉树:

    1
   / \
  2   3
     / \
    4   5

序列化为 "[1,2,3,null,null,4,5]"

注意:本题与主站 297 题相同:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree/

测试用例

  • 功能测试(输入的二叉树是完全二叉树;所有节点都没有左/右子树的二叉树;只有一个节点的二叉树;所有节点的值都相同的二叉树)
  • 特殊输入测试(指向二叉树根节点的指针为空指针)。

题目考点

  • 考察应聘者分析复杂问题的能力。
  • 考察应聘者对二叉树遍历的理解及编程能力。

解题思路

确定序列化规则

如果我们根据前序遍历进行序列化,那么我们只要根据前序遍历解序列化就可以啦!!

参考解题

/** * 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) {
   
        if(root == null) return "[]";
        StringBuilder res = new StringBuilder("[");
        Queue<TreeNode> queue = new LinkedList();
        queue.add(root);
        while(!queue.isEmpty()){
   
            TreeNode node = queue.poll();
            if(node!=null){
   
                res.append(node.val+",");
                queue.add(node.left);
                queue.add(node.right);
            }else res.append("null,");
        }
        return res.toString();
    }

    // Decodes your encoded data to tree.
    public static TreeNode deserialize(String data) {
   
        if(data.equals("[]")) return null;
        String[] vals = data.substring(1,data.length()-1).split(",");
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        Queue<TreeNode> queue = new LinkedList();
        queue.add(root);
        int i=1;
        while(!queue.isEmpty()){
   
            TreeNode node = queue.poll();
            if(!vals[i].equals("null")){
   
                node.left = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.left);
            }
            i++;
            if(!vals[i].equals("null")){
   
                node.right = new TreeNode(Integer.parseInt(vals[i]));
                queue.add(node.right);
            }
            i++;
        }
        return root;
    }
}

// Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
赞(0) 打赏
未经允许不得转载:IDEA激活码 » 剑指Offer系列(java版,详细解析)37.序列化二叉树

一个分享Java & Python知识的社区