Java 序列化和反序列化BST
我正在尝试一个标准的面试问题,即序列化和反序列化二叉搜索树。原始BST已通过在每个空实例上使用前序遍历分隔符作为-1进行序列化。 这是序列化树Java 序列化和反序列化BST,java,binary-search-tree,Java,Binary Search Tree,我正在尝试一个标准的面试问题,即序列化和反序列化二叉搜索树。原始BST已通过在每个空实例上使用前序遍历分隔符作为-1进行序列化。 这是序列化树 1297-1-110-1-11413-1-117-1-19 这是我反序列化BST的代码 public static Node deserialize(List<Integer> list){ int index = 0; return deserialize(list, index); }
1297-1-110-1-11413-1-117-1-19
这是我反序列化BST的代码
public static Node deserialize(List<Integer> list){
int index = 0;
return deserialize(list, index);
}
private static Node deserialize(List<Integer> list, int index) {
if(index == list.size()){
return null;
}
if(list.get(index) == -1){
index++;
return null;
}
Node root = new Node(list.get(index++));
root.setLeft(deserialize(list, index));
root.setRight(deserialize(list, index));
return root;
}
公共静态节点反序列化(列表){
int指数=0;
返回反序列化(列表、索引);
}
私有静态节点反序列化(列表,int索引){
if(index==list.size()){
返回null;
}
if(list.get(index)=-1){
索引++;
返回null;
}
节点根=新节点(list.get(index++));
setLeft(反序列化(列表,索引));
setRight(反序列化(列表,索引));
返回根;
}
但是,这不会产生正确的输出。在调试时,我意识到当函数折叠时,索引的值正在回落到其早期的值,这导致了错误的结果。是否有一种方法可以跨调用堆栈维护索引值。感谢您的帮助。选项1 将参数设为类的字段
public class Deserializer {
private int index = 0;
public Node deserialize(List<Integer> list) {
...
}
}
每当进行递归调用时,使用递归调用的结果更新局部变量
public DeserializationResult deserialize(List<Integer> list, int index) {
...
DeserializationResult leftResult = deserialize(list, index);
index = leftResult.getIndex();
...
}
public反序列化结果反序列化(列表,int索引){
...
反序列化结果leftResult=反序列化(列表、索引);
index=leftResult.getIndex();
...
}
请在函数外部初始化索引变量。主要是作为类参数
请查看此实现:
// Decodes your encoded data to tree.
int index = 0;
public TreeNode deserialize(String data) {
char[] input = data.toCharArray();
return helper2(input , Integer.MIN_VALUE , Integer.MAX_VALUE);
}
private TreeNode helper2(char[] input , int min , int max) {
if (index >= input.length || Integer.valueOf(input[index]) >= max || Integer.valueOf(input[index]) <= min) {
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(input[index++]));
root.left = helper2(input , min,Integer.valueOf(root.val));
root.right = helper2(input , Integer.valueOf(root.val) , max);
return root;
}
//将编码数据解码到树中。
int指数=0;
公共树节点反序列化(字符串数据){
char[]input=data.toCharArray();
返回helper2(输入,Integer.MIN\u值,Integer.MAX\u值);
}
私有树节点帮助器2(字符[]输入,最小整数,最大整数){
如果(index>=input.length | | Integer.valueOf(input[index])>=max | | Integer.valueOf(input[index]),这不是调试服务。
// Decodes your encoded data to tree.
int index = 0;
public TreeNode deserialize(String data) {
char[] input = data.toCharArray();
return helper2(input , Integer.MIN_VALUE , Integer.MAX_VALUE);
}
private TreeNode helper2(char[] input , int min , int max) {
if (index >= input.length || Integer.valueOf(input[index]) >= max || Integer.valueOf(input[index]) <= min) {
return null;
}
TreeNode root = new TreeNode(Integer.valueOf(input[index++]));
root.left = helper2(input , min,Integer.valueOf(root.val));
root.right = helper2(input , Integer.valueOf(root.val) , max);
return root;
}