题目地址:序列化二叉树_牛客题霸_牛客网
题目回顾:
解题思路:
首先,序列化就是将二叉树的节点值放入一个字符串中,这里可以按照前序遍历的思路来进行操作,谦虚遍历是:根左右的情况,其中根据题意我们用"#"来表示空节点,用!来表示节点与节点之间的分割。
而反序列化就是根据序列化得到的字符串将二叉树进行重建操作,这里类似于加密解密的过程。由于我们在序列化的时候采用的是前序遍历,因此在反序列化的过程中,我们也要采用前序遍历。
首先处理空树的情况,在空树时,我们返回”#“,然后调用递归函数前序递归遍历二叉树。
在前序递归函数中,如果遇到非空节点会将其添加到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;}