我正在尝试序列化和反序列化二叉搜索树的标准访谈问题。原始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;
}
然而,这不会产生正确的输出。在调试时,我意识到当函数折叠并导致不正确的结果时,索引的值会回落到它的早期值。有没有办法可以在整个调用堆栈中维护索引值。任何帮助表示赞赏。
答案 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;
}