| 1 |  |  |  | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 2 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 3 |  |  | class TsNode(object): | 
            
                                                                        
                            
            
                                    
            
            
                | 4 |  |  |     key = None | 
            
                                                                        
                            
            
                                    
            
            
                | 5 |  |  |     value = None | 
            
                                                                        
                            
            
                                    
            
            
                | 6 |  |  |     left = None | 
            
                                                                        
                            
            
                                    
            
            
                | 7 |  |  |     mid = None | 
            
                                                                        
                            
            
                                    
            
            
                | 8 |  |  |     right = None | 
            
                                                                        
                            
            
                                    
            
            
                | 9 |  |  |  | 
            
                                                                        
                            
            
                                    
            
            
                | 10 |  |  |     def __init__(self, key, value=None, left=None, right=None, mid=None): | 
            
                                                                        
                            
            
                                    
            
            
                | 11 |  |  |         self.key = key | 
            
                                                                        
                            
            
                                    
            
            
                | 12 |  |  |         if value is not None: | 
            
                                                                        
                            
            
                                    
            
            
                | 13 |  |  |             self.value = value | 
            
                                                                        
                            
            
                                    
            
            
                | 14 |  |  |         if left is not None: | 
            
                                                                        
                            
            
                                    
            
            
                | 15 |  |  |             self.left = left | 
            
                                                                        
                            
            
                                    
            
            
                | 16 |  |  |         if right is not None: | 
            
                                                                        
                            
            
                                    
            
            
                | 17 |  |  |             self.right = right | 
            
                                                                        
                            
            
                                    
            
            
                | 18 |  |  |         if mid is not None: | 
            
                                                                        
                            
            
                                    
            
            
                | 19 |  |  |             self.mid = mid | 
            
                                                                                                            
                            
            
                                    
            
            
                | 20 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 21 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 22 |  |  | def char_at(text, i): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 23 |  |  |     if len(text) - 1 < i: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 24 |  |  |         return -1 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 25 |  |  |     return ord(text[i]) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 26 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 27 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 28 |  |  | class TernarySearchTrie(object): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 29 |  |  |     root = None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 30 |  |  |     N = 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 31 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 32 |  |  |     def put(self, key, value): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 33 |  |  |         self.root = self._put(self.root, key, value, 0) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 34 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 35 |  |  |     def _put(self, x, key, value, d): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 36 |  |  |         c = char_at(key, d) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 37 |  |  |         if x is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 38 |  |  |             x = TsNode(key=c) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 39 |  |  |         compared = c - x.key | 
            
                                                                                                            
                            
            
                                    
            
            
                | 40 |  |  |         if compared < 0: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 41 |  |  |             x.left = self._put(x.left, key, value, d) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 42 |  |  |         elif compared > 0: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 43 |  |  |             x.right = self._put(x.right, key, value, d) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 44 |  |  |         else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 45 |  |  |             if len(key)-1 == d: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 46 |  |  |                 if x.value is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 47 |  |  |                     self.N += 1 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 48 |  |  |                 x.value = value | 
            
                                                                                                            
                            
            
                                    
            
            
                | 49 |  |  |             else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 50 |  |  |                 x.mid = self._put(x.mid, key, value, d + 1) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 51 |  |  |         return x | 
            
                                                                                                            
                            
            
                                    
            
            
                | 52 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 53 |  |  |     def get(self, key): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 54 |  |  |         x = self._get(self.root, key, 0) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 55 |  |  |         if x is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 56 |  |  |             return x.value | 
            
                                                                                                            
                            
            
                                    
            
            
                | 57 |  |  |         return None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 58 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 59 |  |  |     def _get(self, x, key, d): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 60 |  |  |         c = char_at(key, d) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 61 |  |  |         if x is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 62 |  |  |             return None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 63 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 64 |  |  |         compared = c - x.key | 
            
                                                                                                            
                            
            
                                    
            
            
                | 65 |  |  |         if compared < 0: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 66 |  |  |             return self._get(x.left, key, d) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 67 |  |  |         elif compared > 0: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 68 |  |  |             return self._get(x.right, key, d) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 69 |  |  |         else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 70 |  |  |             if len(key) - 1 == d: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 71 |  |  |                 return x | 
            
                                                                                                            
                            
            
                                    
            
            
                | 72 |  |  |             else: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 73 |  |  |                 return self._get(x.mid, key, d + 1) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 74 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 75 |  |  |     def size(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 76 |  |  |         return self.N | 
            
                                                                                                            
                            
            
                                    
            
            
                | 77 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 78 |  |  |     def is_empty(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 79 |  |  |         return self.N == 0 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 80 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 81 |  |  |     def contains_key(self, key): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 82 |  |  |         x = self._get(self.root, key, 0) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 83 |  |  |         if x is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 84 |  |  |             return False | 
            
                                                                                                            
                            
            
                                    
            
            
                | 85 |  |  |         return x.value is not None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 86 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 87 |  |  |     def delete(self, key): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 88 |  |  |         x = self._get(self.root, key, 0) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 89 |  |  |         if x is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 90 |  |  |             self.N -= 1 | 
            
                                                                                                            
                            
            
                                    
            
            
                | 91 |  |  |             x.value = None | 
            
                                                                                                            
                            
            
                                    
            
            
                | 92 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 93 |  |  |     def values(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 94 |  |  |         queue = [] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 95 |  |  |         self._collect_values(self.root, "", queue) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 96 |  |  |         return queue | 
            
                                                                                                            
                            
            
                                    
            
            
                | 97 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 98 |  |  |     def keys(self): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 99 |  |  |         queue = [] | 
            
                                                                                                            
                            
            
                                    
            
            
                | 100 |  |  |         self._collect(self.root, "", queue) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 101 |  |  |         return queue | 
            
                                                                                                            
                            
            
                                    
            
            
                | 102 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 103 |  |  |     def _collect(self, x, prefix, queue): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 104 |  |  |         if x is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 105 |  |  |             return | 
            
                                                                                                            
                            
            
                                    
            
            
                | 106 |  |  |         if x.value is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 107 |  |  |             queue.append(prefix + chr(x.key)) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 108 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 109 |  |  |         self._collect(x.left, prefix, queue) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 110 |  |  |         self._collect(x.mid, prefix + chr(x.key), queue) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 111 |  |  |         self._collect(x.right, prefix, queue) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 112 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 113 |  |  |     def _collect_values(self, x, prefix, queue): | 
            
                                                                                                            
                            
            
                                    
            
            
                | 114 |  |  |         if x is None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 115 |  |  |             return | 
            
                                                                                                            
                            
            
                                    
            
            
                | 116 |  |  |         if x.value is not None: | 
            
                                                                                                            
                            
            
                                    
            
            
                | 117 |  |  |             queue.append(x.value) | 
            
                                                                                                            
                            
            
                                    
            
            
                | 118 |  |  |  | 
            
                                                                                                            
                            
            
                                    
            
            
                | 119 |  |  |         self._collect(x.left, prefix, queue) | 
            
                                                                                                            
                                                                
            
                                    
            
            
                | 120 |  |  |         self._collect(x.mid, prefix + chr(x.key), queue) | 
            
                                                        
            
                                    
            
            
                | 121 |  |  |         self._collect(x.right, prefix, queue) |