2016-07-21 2 views
0

Я пытаюсь решить стандартную проблему сериализации и десериализации двоичного дерева поиска. Исходный BST был сериализован с использованием обхода предварительного порядка разделителем как -1 в каждом нулевом экземпляре. Это сериализованное дерево.Сериализовать и десериализовать BST

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

Это не отладочная служба. – Raedwald

ответ

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(); 
    ... 
} 
Смежные вопросы