【剑指offer较难部分22】序列化二叉树(java)

题目描述

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

二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己的函数来解析回这个二叉树
在这里插入图片描述

分析

这就相当于先遍历二叉树,转成字符串,然后再由字符串转化回原来二叉树
二叉树可以用递归非递归
1、递归

public class Solution {
    
    
    /**
     *序列化:变成字符串
     */
    String Serialize(TreeNode root) {
    
    
        if (root == null) {
    
    
        	return "";
        }
        StringBuffer sb = new StringBuffer(); 
        serializeHelper(root, sb);
        if(sb.length() != 0)
            sb.deleteCharAt(sb.length()-1);//处理最后一个逗号
        return sb.toString();
    }
    
    void serializeHelper(TreeNode node, StringBuffer sb) {
    
    
        if (node == null) {
    
    
            sb.append("#,");
            return;
        }
        // 处理非null元素
        sb.append(node.val + ",");
        // 处理左右孩子节点
        serializeHelper(node.left, sb);
        serializeHelper(node.right, sb);
    }

    /**
     *  反序列化,解析字符串为二叉树
     */
    TreeNode Deserialize(String str) {
    
    
        if (str == null || str.length() == 0) {
    
    
        	return null;
        }
        String[] strArr = str.split(",");
    	return deserializeHelper(strArr);
    }
    
    private int index = -1;
    TreeNode deserializeHelper(String[] strArr) {
    
    
        index++;
        if (!strArr[index].equals("#")) {
    
    
            TreeNode node = new TreeNode(-1);
            node.val = Integer.parseInt(strArr[index]);
            node.left = deserializeHelper(strArr);
            node.right = deserializeHelper(strArr);
            return node;
        }
        return null;
    }
}

在这里插入图片描述
2、非递归

import java.util.Queue;
import java.util.LinkedList;
public class Solution {
    
    
    String Serialize(TreeNode root) {
    
    
        if(root == null)
            return "";
        StringBuffer sb = new StringBuffer();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        TreeNode cur;
        while(!queue.isEmpty()){
    
    
            cur = queue.poll();
            if(cur != null){
    
    
                queue.offer(cur.left);
                queue.offer(cur.right);
                sb.append(cur.val+",");
            }else{
    
    
                sb.append("#,");
            }
        }
        //去掉末尾逗号
        if(sb.length() != 0){
    
    
            sb.deleteCharAt(sb.length()-1);
        }
        return sb.toString();
    }
    TreeNode Deserialize(String str) {
    
    
        TreeNode head = null;
        if(str == null || str.length() == 0) {
    
    
            return head;
        }
        String[] nodes = str.split(",");
        TreeNode[] treeNodes = new TreeNode[nodes.length];//初始化为null并未创建、分配内存
        // 1、创建结点
        for(int i=0; i<nodes.length; i++){
    
    
            if(!nodes[i].equals("#")) {
    
    
                treeNodes[i] = new TreeNode(Integer.parseInt(nodes[i]));
            }
        }
        // 2、将结点链接形成二叉树
        for(int i=0, j = 1; j < treeNodes.length; i++){
    
    
            if(treeNodes[i] != null){
    
    
                treeNodes[i].left = treeNodes[j++];
                treeNodes[i].right = treeNodes[j++];
            }
        }
        return treeNodes[0];
    }
}

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39615182/article/details/112799645