Java 序列化和反序列化BST

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); }

我正在尝试一个标准的面试问题,即序列化和反序列化二叉搜索树。原始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);
    }

    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;
}