題目地址:序列化二叉樹_牛客題霸_牛客網
題目回顧:
解題思路:
首先,序列化就是將二叉樹的節點值放入一個字符串中,這里可以按照前序遍歷的思路來進行操作,謙虛遍歷是:根左右的情況,其中根據題意我們用"#"來表示空節點,用!來表示節點與節點之間的分割。
而反序列化就是根據序列化得到的字符串將二叉樹進行重建操作,這里類似于加密解密的過程。由于我們在序列化的時候采用的是前序遍歷,因此在反序列化的過程中,我們也要采用前序遍歷。
首先處理空樹的情況,在空樹時,我們返回”#“,然后調用遞歸函數前序遞歸遍歷二叉樹。
在前序遞歸函數中,如果遇到非空節點會將其添加到str中,當然也包括表示節點與節點間分割的!符。然后依次遞歸它的左子樹和右子樹。
index則表示的是序列中的下標。
進行反序列化的時候,首先處理空樹的情況,也就是說如果字符串是”#“表示這是一個空樹。如果不是,就調用反序列化的遞歸函數前序遞歸重建二叉樹。在這個遞歸函數當中,如果遇到”#“表示當前節點是空節點,如果遇到數字則根據!符來進行分割操作,同時將數字加入到節點中。根據前序遍歷根左右的順序依次遞歸左右子樹。
整體代碼:
public int index = 0; private void SerializeFunction(TreeNode root, StringBuilder str){if(root == null){str.append('#');return;}str.append(root.val).append('!');SerializeFunction(root.left, str); SerializeFunction(root.right, str);}//序列化public String Serialize(TreeNode root) {if(root == null) return "#";StringBuilder res = new StringBuilder();SerializeFunction(root, res);return res.toString();}private TreeNode DeserializeFunction(String str){if(str.charAt(index) == '#'){ index++;return null;}int val = 0;while(str.charAt(index) != '!' && index != str.length()){ val = val * 10 + ((str.charAt(index)) - '0');index++;}TreeNode root = new TreeNode(val);if(index == str.length()) return root;elseindex++;root.left = DeserializeFunction(str); root.right = DeserializeFunction(str);return root;}//反序列化public TreeNode Deserialize(String str) {if(str == "#") return null;TreeNode res = DeserializeFunction(str);return res;}