package edu.berkeley.nlp.util; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class TrieWithBackPointers<K, V> extends Trie<K, V> { @Override protected Trie<K, V> newTrie(boolean useIdentity2, K first, V v2, Trie<K, V> trie) { return new TrieWithBackPointers<K, V>(useIdentity2, first, v2, trie); } private Trie<K, V> backPointer; private K k; public TrieWithBackPointers(boolean useIdentity) { this(useIdentity, null,null,null); } public TrieWithBackPointers() { this(false, null,null,null); } private TrieWithBackPointers(boolean useIdentity, K k, V v, Trie<K, V> backPointer) { super(useIdentity, k, v, backPointer); this.backPointer = backPointer; this.k = k; } public Trie<K, V> getPreviousTrie() { return backPointer; } @Override public TrieWithBackPointers<K, V> getNextTrie(K k) { return (TrieWithBackPointers<K, V>) super.getNextTrie(k); } public List<K> retraceBackPointers() { List<K> list = new ArrayList<K>(); retraceFromNodeHelper(list); Collections.reverse(list); return list; } private void retraceFromNodeHelper(List<K> list) { if (k == null) return; list.add(k); ((TrieWithBackPointers<K, V>) backPointer).retraceFromNodeHelper(list); } }