Java中的序列化和反序列化是將對(duì)象轉(zhuǎn)化為二進(jìn)制流并存儲(chǔ)或傳輸,以及從二進(jìn)制流中重新構(gòu)建對(duì)象的過(guò)程。在樹(shù)結(jié)構(gòu)中,我們可以將樹(shù)轉(zhuǎn)換為二進(jìn)制流進(jìn)行存儲(chǔ)或傳輸,并在需要時(shí)重新構(gòu)建相應(yīng)的樹(shù)結(jié)構(gòu)。
Java中提供的序列化API是Serializable接口和ObjectOutputStream/ObjectInputStream類(lèi)。我們可以通過(guò)實(shí)現(xiàn)Serializable接口,并利用ObjectOutputStream將樹(shù)結(jié)構(gòu)寫(xiě)入二進(jìn)制流中。反序列化則需要利用ObjectInputStream將二進(jìn)制流讀取出來(lái),然后進(jìn)行反序列化操作。以下是Java樹(shù)序列化和反序列化的示例代碼:
import java.io.*; class TreeNode implements Serializable { int val; TreeNode left; TreeNode right; TreeNode(int val) { this.val = val; } } public class TreeSerialization { public static byte[] serializeTree(TreeNode root) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(baos); oos.writeObject(root); return baos.toByteArray(); } public static TreeNode deserializeTree(byte[] data) throws IOException, ClassNotFoundException { ByteArrayInputStream bais = new ByteArrayInputStream(data); ObjectInputStream ois = new ObjectInputStream(bais); return (TreeNode) ois.readObject(); } public static void main(String[] args) throws IOException, ClassNotFoundException { TreeNode root = new TreeNode(1); root.left = new TreeNode(2); root.right = new TreeNode(3); root.left.left = new TreeNode(4); root.right.left = new TreeNode(5); // 序列化樹(shù) byte[] data = serializeTree(root); // 反序列化樹(shù) TreeNode newRoot = deserializeTree(data); } }
在上面的代碼中,我們定義了一個(gè)TreeNode類(lèi),實(shí)現(xiàn)了Serializable接口,該類(lèi)代表樹(shù)的節(jié)點(diǎn),包括節(jié)點(diǎn)的值、左子樹(shù)和右子樹(shù)。我們還編寫(xiě)了兩個(gè)方法,分別用于將樹(shù)序列化為二進(jìn)制流和反序列化二進(jìn)制流還原樹(shù)。在main方法中,我們創(chuàng)建了一棵樹(shù)并進(jìn)行序列化,然后對(duì)序列化后的二進(jìn)制流執(zhí)行反序列化操作,得到一棵新的樹(shù)。