欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java序列化二叉树

程序员文章站 2022-03-10 10:32:55
文章目录一、题目解析二、代码三、总结一、题目解析请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点...



一、题目解析

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

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

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

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

序列化和反序列化可以借助层序遍历实现,利用队列的先进先出特性

序列化:利用队列实现层序遍历

反序列化:利用层序遍历的特点,i 节点的左右节点为 i+1,i+2

二、代码

public class Test_18 { String Serialize(TreeNode root) { StringBuffer buffer = new StringBuffer(); Queue<TreeNode> queue = new LinkedList<>(); if (root == null) { return "#,"; } queue.add(root); //队列不空,逐次添加左右子树 while (!queue.isEmpty()){ TreeNode node = queue.poll(); if (node != null) { queue.add(node.left); queue.add(node.right); buffer.append(node.val+","); }else { buffer.append("#"+","); } } return buffer.toString(); } TreeNode Deserialize(String str) { if (str == null || str.length() == 0) { return null; } //以逗号进行分割,获取二叉树值列表 String[] split = str.split(","); //用来构建二叉树 TreeNode[] nodes = new TreeNode[split.length]; for (int i = 0; i < split.length; i++) { if (!split[i].equals("#")){ //初始化node[i]节点,并为其赋值 nodes[i]=new TreeNode(Integer.valueOf(split[i])); } } //利用层序遍历的特点,对于节点 i 它的左右节点分别为:i+1,i+2 for (int i = 0,j=1; j < nodes.length; i++) { if (nodes[i] != null) { nodes[i].left=nodes[j++]; nodes[i].right=nodes[j++]; } } return nodes[0]; } } 

三、总结

(1)String、StringBuffer 和 StringBuilder 的区别

(2)字符的分割函数 split:将字符串以指定字符分割

 //以逗号进行分割,获取二叉树值列表 String[] split = str.split(","); 
import java.util.LinkedList; import java.util.Queue; /**
 * @Author: Yolo
 * @Date: 2020/9/28 20:14
 * @Description:
 */ public class Test_18 { String Serialize(TreeNode root) { StringBuilder buffer = new StringBuilder(); Queue<TreeNode> queue = new LinkedList<>(); if (root == null) { return "#,"; } queue.add(root); //队列不空,逐次添加左右子树 while (!queue.isEmpty()){ TreeNode node = queue.poll(); if (node != null) { queue.add(node.left); queue.add(node.right); buffer.append(node.val+","); }else { buffer.append("#"+","); } } return buffer.toString(); } TreeNode Deserialize(String str) { if (str == null || str.length() == 0) { return null; } //以逗号进行分割,获取二叉树值列表 String[] split = str.split(","); //用来构建二叉树 TreeNode[] nodes = new TreeNode[split.length]; for (int i = 0; i < split.length; i++) { if (!split[i].equals("#")){ //初始化node[i]节点,并为其赋值 nodes[i]=new TreeNode(Integer.valueOf(split[i])); } } //利用层序遍历的特点,对于节点 i 它的左右节点分别为:i+1,i+2 for (int i = 0,j=1; j < nodes.length; i++) { if (nodes[i] != null) { nodes[i].left=nodes[j++]; nodes[i].right=nodes[j++]; } } return nodes[0]; } } 

本文地址:https://blog.csdn.net/nanhuaibeian/article/details/108853402