序列化和反序列化BST

时间:2016-07-21 22:55:01

标签: java binary-search-tree

我正在尝试序列化和反序列化二叉搜索树的标准访谈问题。原始BST已通过使用preorder在每个null实例遍历分隔符为-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;
    }

然而,这不会产生正确的输出。在调试时,我意识到当函数折叠并导致不正确的结果时,索引的值会回落到它的早期值。有没有办法可以在整个调用堆栈中维护索引值。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:0)

选项1

使参数成为该类的一个字段。

public class Deserializer {
    private int index = 0;
    public Node deserialize(List<Integer> list) {
        ...
    }
}

选项2

从方法中返回参数。

public class DeserializationResult {
    private Node node;
    private int index;
    ... constructor and getters ...
}

每当进行递归调用时,使用递归调用的结果更新局部变量。

public DeserializationResult deserialize(List<Integer> list, int index) {
    ...
    DeserializationResult leftResult = deserialize(list, index);
    index = leftResult.getIndex();
    ... 
}

答案 1 :(得分:0)

请在函数外部初始化索引变量。主要作为类参数。

查看此实施:

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