题目描述
序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
编码的字符串应尽可能紧凑。
示例 1:
输入:root = [2,1,3]
输出:[2,1,3]
示例 2:
输入:root = []
输出:[]
提示:
树中节点数范围是 [0, 104]
0 <= Node.val <= 104
题目数据 保证 输入的树是一棵二叉搜索树。
解题思路
序列化:对二叉树后序遍历,将所有结点的值存储在字符串中。
反序列化:将所有结点的值依次从字符串中读取出来并压入栈中,此时栈顶元素即为该二叉搜索树的根节点值。初始时将栈顶元素value
取出并构造根节点,此时value
和MAX_VALUE
之间的值即为右子树的所有元素,同理,MIN_VALUE
和value
之间的值即为左子树的所有元素。递归计算这个过程,即可构造好这棵二叉树。
代码:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root==null) return "";
else {
return serialize(root.left)+serialize(root.right)+root.val+",";
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.isEmpty()) return null;
Stack<Integer> stack= new Stack<>();
String[] da=data.split(",");
for (String s : da) {
stack.push(Integer.parseInt(s));
}
return gener(Integer.MIN_VALUE,Integer.MAX_VALUE,stack);
}
public TreeNode gener(int low,int high,Stack<Integer> stack){
if(stack.isEmpty()||stack.peek()<low||stack.peek()>high)
return null;
int val=stack.pop();
TreeNode root=new TreeNode(val);
root.right=gener(val,high,stack);
root.left=gener(low,val,stack);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// String tree = ser.serialize(root);
// TreeNode ans = deser.deserialize(tree);
// return ans;